Проблема Lucene.NET - PullRequest
5 голосов
/ 31 мая 2011

У меня проблема с использованием SnowBallAnalyzer в Lucene.NET.Для некоторых слов это прекрасно работает, но для других это не дает никаких результатов, и я не уверен, как углубиться в это, чтобы выяснить, что происходит.Я проверяю поиск в файле описания продуктов питания USDA, который можно найти здесь (http://www.ars.usda.gov/SP2UserFiles/Place/12354500/Data/SR23/asc/FOOD_DES.txt). Я использую английский алгоритм stemming. При поиске «яиц» я получаю следующие результаты:

Bagels, egg
Bread, egg
Egg, whole, raw, fresh
Egg, white, raw, fresh
Egg, yolk, raw, fresh
Egg, yolk, raw, frozen
Egg, whole, cooked, fried
...

Эти результаты великолепны. Однако я не получаю никаких результатов при поиске «apple». Когда я использую 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();
}

1 Ответ

5 голосов
/ 01 июня 2011

Вы уверены, что использовали Lucene.Net.Analysis.Snowball.SnowballAnalyzer("English") для написания индекса? Вы должны использовать один и тот же анализатор для написания и запроса индекса.

...