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
。抱歉,我在提供命名空间时没有指定。
我正在尝试将 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
。抱歉,我在提供命名空间时没有指定。