我在 Lucene.NET 中使用 SnowBallAnalyzer 时遇到了问题。它适用于某些单词,但其他单词根本找不到任何结果,我不确定如何进一步深入研究以找出正在发生的事情。我正在测试可在此处找到的 USDA 食品描述文件的搜索(http://www.ars.usda.gov/SP2UserFiles/Place/12354500/Data/SR23/asc/FOOD_DES.txt)。我正在使用英语词干算法。搜索“鸡蛋”时,我得到以下结果:
Bagels, egg
Bread, egg
Egg, whole, raw, fresh
Egg, white, raw, fresh
Egg, yolk, raw, fresh
Egg, yolk, raw, frozen
Egg, whole, cooked, fried
...
这些结果很棒。但是,在搜索“苹果”时我根本没有得到任何结果。当我使用 StandardAnalyzer 并搜索“apple”时,我得到以下结果。
Croissants, apple
Strudel, apple,
Babyfood, juice, apple
Babyfood, apple-banana juice
...
不是最好的结果,但至少它显示了一些东西。任何人都知道为什么词干分析器会以我不会得到任何结果的方式进行过滤?
编辑:这是我正在使用的原型代码。
static string[] Search(string searchTerm)
{
//Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Snowball.SnowballAnalyzer("English");
Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer();
Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", analyzer);
Lucene.Net.Search.Query query = parser.Parse(searchTerm);
Lucene.Net.Search.Searcher searcher = new Lucene.Net.Search.IndexSearcher(Lucene.Net.Store.FSDirectory.Open(new DirectoryInfo("./index/")), true);
var topDocs = searcher.Search(query, null, 10);
List<string> results = new List<string>();
foreach(var scoreDoc in topDocs.scoreDocs)
{
results.Add(searcher.Doc(scoreDoc.doc).Get("raw"));
}
return results.ToArray();
}