如何解决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);
.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 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 举报,一经查实,本站将立刻删除。