0

Lucene 4 のレーベンシュタイン実装では、以前よりも 100 倍高速であると主張しています ( http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html )。クエリ内のすべての用語の一致。「グレン ホース」を検索すると、「グリーン ハウス」というドキュメントが見つかるはずです (この時点では語句はあまり気にしません。引用符は読みやすくするためにここに表示されています)。

私はLucene 4 + Solr 4を使用しています。前処理と後処理を行っているため、Solrの周りに小さなラッパーサーブレットがあり、サーブレットはSolrJを使用して最終的にSolrにアクセスしています

私は現在、これを達成するための正しい方法について少し迷っています。私の基本的なアプローチは、検索クエリを用語に分割し、チルダ/ファジー演算子を各用語に追加することです。したがって、「グレン ホース」は「グレン~ホース~」になります。ここで問題は、これを適切に行う方法です。私はいくつかの方法を見ることができます:

  1. ブルート フォース: 用語が空白で区切られていると仮定して、クエリを解析し、各空白の前 (つまり、各用語の後) にチルダを追加するだけです。
  2. 2 つの手順: クエリのデバッグを有効にしてクエリを Solr に送信します。これにより、Solr によって解析されたクエリ用語のリストが表示されます。次に、デバッグ出力から用語を抽出し、チルダ演算子を追加して、チルダ演算子を追加してクエリを再実行します。
  3. 内部: 検索リクエスト ハンドラーにフックし、クエリが用語に解析された後にチルダ演算子を追加します。

方法 1 は、Solr のクエリ解析を完全に回避するため、非常に悪臭を放ちます。方法 2 は、クエリを 2 回解析するコストがそれほど高くない場合、非常に実行可能に思えます。方法 3 は適切に聞こえますが、処理チェーンのどこに接続する必要があるかはまだわかりません。

私がやりたいことを達成するためのまったく別の方法があるのか​​もしれませんし、それは私の愚かな考えかもしれません。とにかく、いくつかの指針をいただければ幸いです。他の誰かがすでにこのようなことをしているかもしれません。ありがとう!

4

1 に答える 1

1

次の方法を提案します。

  1. 入力ユーザー クエリから solr クエリを作成できるクエリ ハンドラー モジュールをアプリケーションに実装します。このように、SOLR 側では何も変更されず、アプリケーションは SOLR に入る内容をすべて制御できます。

  2. 独自のクエリ パーサーを実装します。標準の SOLR クエリ パーサー (org.apache.solr.search.QParser) から開始して、変更を加えることができます。アプリケーションは、カスタム クエリ パーサーを選択するだけで済み、あとは実装が面倒を見る必要があります。

これにより、システムがSOLRのアップグレードに完全に依存しなくなり、Solrの新しいリリースではカスタムqparserを更新する必要がなく、新しいバージョンでカスタムqparserを更新/構築およびセットアップする必要がないため、方法1をお勧めします。

アプリを制御できず、qparser ルートを通過したくない場合は、solr リクエスト フィルターにディスパッチされる前に solr クエリを変換するサーブレット フィルターを実装できます。

于 2012-12-31T06:00:39.547 に答える