微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c#演示的新手Lucene问题“找不到类型或命名空间'StandardAnalyzer'”

如何解决c#演示的新手Lucene问题“找不到类型或命名空间'StandardAnalyzer'”

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

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

我创建了一个新的Forms App。

运行Install-Package Lucene.Net -Pre,并下载了nuget程序包。

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

Visual Studio弹出大量缺少的程序集引用,因此我单击了“可能的修复”,并让它在开始时添加了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);

enter image description here

.Dump

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

enter image description here

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

使用namespace Lucene.Net.Analysis.Standard

更新

enter image description here

解决方法

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

对于.Dump,我没有确切的答案。 hit.Score是一个浮点数,所以hit.Score.Dump("Score");有点难以想象。我在Lucene net仓库中搜索了Dump一词,只有20次出现。 https://github.com/apache/lucenenet/search?p=1&q=Dump

其中之一是您引用的代码教程示例。但是其他任何事件似乎都不是该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。抱歉,提供命名空间时我没有指定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。