Lucene 4 のレーベンシュタイン実装では、以前よりも 100 倍高速であると主張しています ( http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html )。クエリ内のすべての用語の一致。「グレン ホース」を検索すると、「グリーン ハウス」というドキュメントが見つかるはずです (この時点では語句はあまり気にしません。引用符は読みやすくするためにここに表示されています)。
私はLucene 4 + Solr 4を使用しています。前処理と後処理を行っているため、Solrの周りに小さなラッパーサーブレットがあり、サーブレットはSolrJを使用して最終的にSolrにアクセスしています
私は現在、これを達成するための正しい方法について少し迷っています。私の基本的なアプローチは、検索クエリを用語に分割し、チルダ/ファジー演算子を各用語に追加することです。したがって、「グレン ホース」は「グレン~ホース~」になります。ここで問題は、これを適切に行う方法です。私はいくつかの方法を見ることができます:
- ブルート フォース: 用語が空白で区切られていると仮定して、クエリを解析し、各空白の前 (つまり、各用語の後) にチルダを追加するだけです。
- 2 つの手順: クエリのデバッグを有効にしてクエリを Solr に送信します。これにより、Solr によって解析されたクエリ用語のリストが表示されます。次に、デバッグ出力から用語を抽出し、チルダ演算子を追加して、チルダ演算子を追加してクエリを再実行します。
- 内部: 検索リクエスト ハンドラーにフックし、クエリが用語に解析された後にチルダ演算子を追加します。
方法 1 は、Solr のクエリ解析を完全に回避するため、非常に悪臭を放ちます。方法 2 は、クエリを 2 回解析するコストがそれほど高くない場合、非常に実行可能に思えます。方法 3 は適切に聞こえますが、処理チェーンのどこに接続する必要があるかはまだわかりません。
私がやりたいことを達成するためのまったく別の方法があるのかもしれませんし、それは私の愚かな考えかもしれません。とにかく、いくつかの指針をいただければ幸いです。他の誰かがすでにこのようなことをしているかもしれません。ありがとう!