Lucene.NETでSnowBallAnalyzerを使用すると問題が発生します。一部の単語ではうまく機能しますが、他の単語ではまったく結果が得られず、何が起こっているのかを調べるためにこれをさらに掘り下げる方法がわかりません。ここにあるUSDAFoodDescriptionファイル(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();
}