如何解决无法创建 Lucene.Net StandardAnalyzer 的实例
我正在尝试使用 Lucene.NET,并且正在遵循此链接上提供的文档 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);
我得到的例外是
“Lucene.Net.Analysis.Standard.StandardAnalyzer”的类型初始值设定项引发异常。
找不到方法:'System.Collections.Generic.List`1 Lucene.Net.Support.Arrays.AsList(!!0[])'。
感谢您提供任何帮助,因为我被困在这个问题上,无法继续我的 POC。
解决方法
这是一条非常奇怪的错误消息。似乎是说系统找不到通用列表类型。在 .Net 5 中,此类型存储在此处:
区域组装 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-beta00013,但自 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","Everyone is gifted.","003","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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。