Lucene.net で「もしかして」機能を実装する方法を教えてください。
ありがとう!
contrib dirのSpellCheckerモジュールを調べる必要があります。これは Java lucene のSpellCheckerモジュールのポートであるため、そのドキュメントが役立つはずです。
(javadocs から:)
使用例:
import org.apache.lucene.search.spell.SpellChecker;
SpellChecker spellchecker = new SpellChecker(spellIndexDirectory);
// To index a field of a user index:
spellchecker.indexDictionary(new LuceneDictionary(my_lucene_reader, a_field));
// To index a file containing words:
spellchecker.indexDictionary(new PlainTextDictionary(new File("myfile.txt")));
String[] suggestions = spellchecker.suggestSimilar("misspelt", 5);
AFAIK Lucene は近接検索をサポートしています。つまり、次のようなものを使用する場合:
field:stirng~0.5
(それはチルダ記号です)
「文字列」にマッチします。float は、検索がどの程度「寛容」であるかを示します。ここで、1.0 は完全一致で、0.0 はすべてに一致します (並べ替え)。
ただし、異なるパーサーはこれを異なる方法で実装します。
近接検索はあいまい検索 (stri*) よりもはるかに遅いため、注意して使用してください。あなたの場合、通常の検索で一致が見つからない場合は、近接検索を試みて見つけたものを確認し、その結果に基づいて「もしかして」を提示すると仮定します。
パフォーマンス上の理由から、非常に一般的なスペルミスのこの種のルックアップをキャッシュすると便利な場合があります。
Semanticvectors と呼ばれる Google コード プロジェクトを見てください。Lucene メーリング リストでは、使用後のような機能を実現するためのかなりの量の議論がありますが、これは Java で記述されています。
このような機能を構築するには、おそらく検索ログでいくつかの機械学習アルゴリズムを解析して使用する必要があります!