2011-05-31 84 views
5

我在Lucene.NET中使用SnowBallAnalyzer遇到问题。它适用于某些单词,但其他单词根本找不到任何结果,我不确定如何进一步深入了解发生的情况。我正在测试美国农业部食品描述文件的搜索,可以在这里找到(http://www.ars.usda.gov/SP2UserFiles/Place/12354500/Data/SR23/asc/FOOD_DES.txt)。我正在使用英文词干算法。当搜索“鸡蛋”时,我得到以下结果:Lucene.NET词干问题

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,并搜索“苹果”时,我得到以下结果。

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(); 
} 

回答

5

您确定您使用Lucene.Net.Analysis.Snowball.SnowballAnalyzer("English")来编写索引吗?您必须使用相同的分析器来编写和查询索引。

+0

这可能是它。我会确认并接受。谢谢! – 2011-06-01 00:53:19