C# 演示的新手 Lucene 问题 "The Type or Namespace 'StandardAnalyzer' could not be found"

Newbie Lucene Problem with c# demo "The Type or Namespace 'StandardAnalyzer' could not be found"

我正在尝试将 Lucene.net (4.8.0-beta00012) 的基本演示升级到 运行。

http://lucenenet.apache.org/#quick-start

我创建了一个新的表单应用程序。

运行 Install-Package Lucene.Net -Pre 并且已经下载了 nuget 包。

复制并粘贴所有演示部分:创建索引并定义文本分析器添加到索引构造查询,然后获取结果

Visual Studio 弹出了一大堆缺少的程序集引用,所以我单击了 'Potential Fixes' 并让它在开头添加了 using 语句。

using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;
using System;
using System.Windows.Forms;


namespace Lucene_CS
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Ensures index backwards compatibility
            var AppLuceneVersion = LuceneVersion.LUCENE_48;

            var indexLocation = @"C:\Index";
            var dir = FSDirectory.Open(indexLocation);

            //create an analyzer to process the text
            var analyzer = new StandardAnalyzer(AppLuceneVersion);

            //create an index writer
            var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer);
            var writer = new IndexWriter(dir, indexConfig);


            var source = new
            {
                Name = "Kermit the Frog",
                FavoritePhrase = "The quick brown fox jumps over the lazy dog"
            };
            Document doc = new Document
            {

                new StringField("name",
                    source.Name,
                    Field.Store.YES),
                new TextField("favoritePhrase",
                    source.FavoritePhrase,
                    Field.Store.YES)
            };

            writer.AddDocument(doc);
            writer.Flush(triggerMerge: false, applyAllDeletes: false);


            // search with a phrase
            var phrase = new MultiPhraseQuery
            {
                new Term("favoritePhrase", "brown"),
                new Term("favoritePhrase", "fox")
            };

            // re-use the writer to get real-time updates
            var searcher = new IndexSearcher(writer.GetReader(applyAllDeletes: true));
            var hits = searcher.Search(phrase, 20 /* top 20 */).ScoreDocs;
            foreach (var hit in hits)
            {
                var foundDoc = searcher.Doc(hit.Doc);
                hit.Score.Dump("Score");
                foundDoc.Get("name").Dump("Name");
                foundDoc.Get("favoritePhrase").Dump("Favorite Phrase");
            }




        }
    }
}

现在我剩下一对无法解决的问题:

   var analyzer = new StandardAnalyzer(AppLuceneVersion);

和.Dump

  hit.Score.Dump("Score");
  foundDoc.Get("name").Dump("Name");
  foundDoc.Get("favoritePhrase").Dump("Favorite Phrase");

我将如何调试它以确定如何正确指定引用?

更新 namespace Lucene.Net.Analysis.Standard

StandardAnalyzer 位于命名空间 Lucene.Net.Analysis.Standard.

关于.Dump,我没有确切的答案给你。 hit.Score是一个浮点数,所以hit.Score.Dump("Score");有点难以想象。我在 lucene 网络存储库中搜索了 Dump 这个词,结果只出现了 20 次。 https://github.com/apache/lucenenet/search?p=1&q=Dump

其中之一就是您引用的代码教程示例。但是 none 的其他事件似乎是该 Dump 方法的实现。所以我猜 .Dump 不再是引用用途的有效方法。

我建议更改

foreach (var hit in hits)
            {
                var foundDoc = searcher.Doc(hit.Doc);
                hit.Score.Dump("Score");
                foundDoc.Get("name").Dump("Name");
                foundDoc.Get("favoritePhrase").Dump("Favorite Phrase");
            }

foreach (var hit in hits)
            {
                var foundDoc = searcher.Doc(hit.Doc);
                var score = hit.Score;
                var name = foundDoc.Get("name");
                var favoritePhrase = foundDoc.Get("favoritePhrase");
            }

这可能对您有用,并允许您检查通过调试器检索的字段。

我可能要补充一点,虽然 Lucene.Net 上的信息对初学者来说似乎有点局限,但该系统非常强大且非常强大。我这么说是为了鼓励你学习它,因为它非常值得学习。我喜欢它。

更新
正如@bendecko 在下面的评论中所说,您需要从 NuGet 安装包 Lucene.Net.Analysis.Common。抱歉,我在提供命名空间时没有指定。