无法创建Lucene.Net StandardAnalyzer的实例



我正在尝试使用Lucene.NET,并遵循此链接上提供的文档https://lucenenet.apache.org/

我使用的是带有.NET Core 5.0版本的Lucene版本(4.8.0-beta00012(。

创建StandardAnalyzer对象实例时出现异常。

const LuceneVersion AppLuceneVersion = LuceneVersion.LUCENE_48;
// Create an analyzer to process the text
var analyzer = new StandardAnalyzer(AppLuceneVersion);

我得到的例外是

"Lucene.Net.Analysis.Standard.StandardAnalyzer"的类型初始值设定项引发异常。

找不到方法:'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\5.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-beta0013,但自从Lucene.Net版本4.8.0-beta0006以来,我一直在使用Lucene.Net和其他版本的.Net Core,我的个人经验是,这是一个令人惊叹的搜索库。

为了在.Net 5.0上测试Lucene.Net StandardAnalyzer,我在xUnit中创建了下面的单元测试。单元测试通过并证明StandardAnalyzer正在工作。这段代码可能会被简化一点,因为它使用了一种提供近实时阅读器的方法,但一旦您解决了系统找不到通用List类的原因,它将为您提供一个丰富的示例。

[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);
}

}

相关内容

  • 没有找到相关文章

最新更新