无法创建 Lucene.Net StandardAnalyzer 的实例
Can not create instance of Lucene.Net StandardAnalyzer
我正在尝试使用 Lucene.NET 并且我正在关注此 link 提供的文档
https://lucenenet.apache.org/
我正在使用 Lucene 版本 (4.8.0-beta00012) 和 .NET Core 5.0 版本。
我在创建 StandardAnalyzer 对象的实例时遇到异常。
const LuceneVersion AppLuceneVersion = LuceneVersion.LUCENE_48;
// Create an analyzer to process the text
var analyzer = new StandardAnalyzer(AppLuceneVersion);
我得到的异常是
The type initializer for 'Lucene.Net.Analysis.Standard.StandardAnalyzer' threw an exception.
Method not found: 'System.Collections.Generic.List`1<!!0> Lucene.Net.Support.Arrays.AsList(!!0[])'.
感谢任何帮助,因为我受困于此,无法继续我的 POC。
收到的错误消息真奇怪。似乎是说系统无法找到通用列表类型。在 .Net 5 中,这种类型存储在这里:
region Assembly System.Collections, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref.0.0\ref\net5.0\System.Collections.dll
虽然您看到错误是因为 StandardAnalyzer 使用此类型并且系统无法找到它,但问题很可能与 Lucene.Net 本身无关。您可以通过尝试执行以下操作来测试该理论:
List<string> list = new List<string>();
list.Add("hello world");
有一个很好的变化,代码会以同样的方式爆炸。如果是,则问题与 Lucene 无关。
我能肯定地说的是Lucene。 4.8 Beta,功能极其完备,非常稳定,StandardAnalyzer
在我使用 .Net 5.0 的系统上运行良好。我碰巧在 .Net 5 中使用 Lucene.Net 4.8.0-beta00013 但自从 Lucene.Net 版本 4.8.0-beta0006 以来我一直在使用 Lucene.Net 和其他版本的 .Net Core ,我个人的经验是,它是一个 惊人的 搜索库。
为了在 .Net 5.0 上为您测试 Lucene.Net StandardAnalyzer,我在 xUnit 中创建了下面的单元测试。单元测试通过并证明 StandardAnalyzer
正在运行。这段代码可能会被简化一点,因为它使用了一种提供近乎实时 reader 的方法,但是一旦你解决了为什么你的系统找不到通用列表 class.
[Fact]
public void TestStandardAnalyzer() {
Directory indexDir = new RAMDirectory();
Analyzer standardAnalyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
IndexWriterConfig indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, standardAnalyzer);
indexConfig.UseCompoundFile = true;
IndexWriter writer = new IndexWriter(indexDir, indexConfig);
//souce: https://github.com/apache/lucenenet/blob/Lucene.Net_4_8_0_beta00006/src/Lucene.Net/Search/SearcherFactory.cs
SearcherManager searcherManager = new SearcherManager(writer, applyAllDeletes: true, new SearchWarmer());
Document doc = new Document();
doc.Add(new StringField("examplePrimaryKey", "001", Field.Store.YES));
doc.Add(new TextField("exampleField", "Unique gifts are great gifts.", Field.Store.YES));
writer.AddDocument(doc);
doc = new Document();
doc.Add(new StringField("examplePrimaryKey", "002", Field.Store.YES));
doc.Add(new TextField("exampleField", "Everyone is gifted.", Field.Store.YES));
writer.AddDocument(doc);
doc = new Document();
doc.Add(new StringField("examplePrimaryKey", "003", Field.Store.YES));
doc.Add(new TextField("exampleField", "Gifts are meant to be shared.", Field.Store.YES));
writer.AddDocument(doc);
writer.Commit();
searcherManager.MaybeRefreshBlocking();
IndexSearcher indexSearcher = searcherManager.Acquire();
try {
QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, "exampleField", standardAnalyzer);
Query query = parser.Parse("everyone");
TopDocs topDocs = indexSearcher.Search(query, int.MaxValue);
int numMatchingDocs = topDocs.ScoreDocs.Length;
Assert.Equal(1, numMatchingDocs);
Document docRead = indexSearcher.Doc(topDocs.ScoreDocs[0].Doc);
string primaryKey = docRead.Get("examplePrimaryKey");
Assert.Equal("002", primaryKey);
} finally {
searcherManager.Release(indexSearcher);
}
}
我正在尝试使用 Lucene.NET 并且我正在关注此 link 提供的文档 https://lucenenet.apache.org/
我正在使用 Lucene 版本 (4.8.0-beta00012) 和 .NET Core 5.0 版本。
我在创建 StandardAnalyzer 对象的实例时遇到异常。
const LuceneVersion AppLuceneVersion = LuceneVersion.LUCENE_48;
// Create an analyzer to process the text
var analyzer = new StandardAnalyzer(AppLuceneVersion);
我得到的异常是
The type initializer for 'Lucene.Net.Analysis.Standard.StandardAnalyzer' threw an exception.
Method not found: 'System.Collections.Generic.List`1<!!0> Lucene.Net.Support.Arrays.AsList(!!0[])'.
感谢任何帮助,因为我受困于此,无法继续我的 POC。
收到的错误消息真奇怪。似乎是说系统无法找到通用列表类型。在 .Net 5 中,这种类型存储在这里:
region Assembly System.Collections, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a // C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref.0.0\ref\net5.0\System.Collections.dll
虽然您看到错误是因为 StandardAnalyzer 使用此类型并且系统无法找到它,但问题很可能与 Lucene.Net 本身无关。您可以通过尝试执行以下操作来测试该理论:
List<string> list = new List<string>();
list.Add("hello world");
有一个很好的变化,代码会以同样的方式爆炸。如果是,则问题与 Lucene 无关。
我能肯定地说的是Lucene。 4.8 Beta,功能极其完备,非常稳定,StandardAnalyzer
在我使用 .Net 5.0 的系统上运行良好。我碰巧在 .Net 5 中使用 Lucene.Net 4.8.0-beta00013 但自从 Lucene.Net 版本 4.8.0-beta0006 以来我一直在使用 Lucene.Net 和其他版本的 .Net Core ,我个人的经验是,它是一个 惊人的 搜索库。
为了在 .Net 5.0 上为您测试 Lucene.Net StandardAnalyzer,我在 xUnit 中创建了下面的单元测试。单元测试通过并证明 StandardAnalyzer
正在运行。这段代码可能会被简化一点,因为它使用了一种提供近乎实时 reader 的方法,但是一旦你解决了为什么你的系统找不到通用列表 class.
[Fact]
public void TestStandardAnalyzer() {
Directory indexDir = new RAMDirectory();
Analyzer standardAnalyzer = new StandardAnalyzer(LuceneVersion.LUCENE_48);
IndexWriterConfig indexConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, standardAnalyzer);
indexConfig.UseCompoundFile = true;
IndexWriter writer = new IndexWriter(indexDir, indexConfig);
//souce: https://github.com/apache/lucenenet/blob/Lucene.Net_4_8_0_beta00006/src/Lucene.Net/Search/SearcherFactory.cs
SearcherManager searcherManager = new SearcherManager(writer, applyAllDeletes: true, new SearchWarmer());
Document doc = new Document();
doc.Add(new StringField("examplePrimaryKey", "001", Field.Store.YES));
doc.Add(new TextField("exampleField", "Unique gifts are great gifts.", Field.Store.YES));
writer.AddDocument(doc);
doc = new Document();
doc.Add(new StringField("examplePrimaryKey", "002", Field.Store.YES));
doc.Add(new TextField("exampleField", "Everyone is gifted.", Field.Store.YES));
writer.AddDocument(doc);
doc = new Document();
doc.Add(new StringField("examplePrimaryKey", "003", Field.Store.YES));
doc.Add(new TextField("exampleField", "Gifts are meant to be shared.", Field.Store.YES));
writer.AddDocument(doc);
writer.Commit();
searcherManager.MaybeRefreshBlocking();
IndexSearcher indexSearcher = searcherManager.Acquire();
try {
QueryParser parser = new QueryParser(LuceneVersion.LUCENE_48, "exampleField", standardAnalyzer);
Query query = parser.Parse("everyone");
TopDocs topDocs = indexSearcher.Search(query, int.MaxValue);
int numMatchingDocs = topDocs.ScoreDocs.Length;
Assert.Equal(1, numMatchingDocs);
Document docRead = indexSearcher.Doc(topDocs.ScoreDocs[0].Doc);
string primaryKey = docRead.Get("examplePrimaryKey");
Assert.Equal("002", primaryKey);
} finally {
searcherManager.Release(indexSearcher);
}
}