Lucene.NET 词干处理问题

5

我在使用Lucene.NET中的SnowBallAnalyzer时遇到了问题。对于某些单词,它可以很好地工作,但对于其他单词,它根本找不到任何结果,我不确定如何进一步挖掘这个问题以找出发生了什么。我正在测试对USDA食品描述文件的搜索,该文件可以在此处找到(http://www.ars.usda.gov/SP2UserFiles/Place/12354500/Data/SR23/asc/FOOD_DES.txt)。我正在使用英语词干提取算法。当搜索“eggs”时,我得到以下结果:

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();
}
1个回答

5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接