【问题标题】:Can not create instance of Lucene.Net StandardAnalyzer无法创建 Lucene.Net StandardAnalyzer 的实例
【发布时间】:2021-04-14 21:29:53
【问题描述】:

我正在尝试使用 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 Lucene.Net.Support.Arrays.AsList(!!0[])'。

感谢您提供任何帮助,因为我对此感到困惑,无法继续我的 POC。

【问题讨论】:

  • @andrewjames :感谢您的想法。使用 v3.0.3 不适用于 Azure 目录和 .net 核心,但您的评论确实引导了我一个想法,我使用了以前的 Lucene.NET 测试版,看起来 4.8.0-beta06 效果很好。

标签: .net-core indexing lucene lucene.net


【解决方案1】:

这是一个非常奇怪的错误消息。似乎是说系统找不到通用列表类型。在 .Net 5 中,这种类型存储在这里:

区域组装 System.Collections,版本=5.0.0.0,文化=中性,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", 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);
            }
            
        }

【讨论】:

  • 谢谢你。我陷入了this trap,认为Install-Package Lucene.Net -Pre 就足够了。但是在运行 Install-Package Lucene.Net.Analysis.Common -Version 4.8.0-beta00013 之后,我能够找到 4.8 的缺失组件,例如 StandardAnalyzer 通过 using Lucene.Net.Analysis.Standard;
猜你喜欢
  • 2011-07-27
  • 2011-09-09
  • 2021-05-17
  • 2012-01-29
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多