3

現在取り組んでいるWebアプリにあいまい検索機能を実装したいと思います。バックエンドはJavaであり、ここで誰もが推奨する検索エンジンであるLuceneもJavaでコーディングされています。しかし、私はいくつかの理由でそれを使用することを躊躇しています:

  1. 自分で何かを作ることができたと感じます。
  2. Luceneには、自分では利用していない機能がたくさんあります。膨満感を最小限に抑えたいのですが。
  3. 私が理解していることから、Luceneのあいまい検索の実装は、インデックス付けされた各用語の編集距離を手動で評価します。私が採用したいアプローチ(以下に詳述)は、より効率的だと思います。

インデックス付けされるデータは、英語の名詞と親名詞のセット全体である可能性があるため、Luceneのあいまい検索へのアプローチがどのように私を疲れさせるかを確認できます。

私がやりたいのは、問題に対してn-gramベースのアプローチを取ることです。データベースから各アイテムを読み取ってトークン化し、指定されたn-gramとその場所で指定されたファイルのディスクに保存します。

例:仮定しましょう。n = 3私のファイル命名スキームは次のようなものです[n-gram]_[location_of_n-gram_in_string].txt

ファイルには次のものbea_0.txtが含まれます。

bear
beau
beacon
beautiful
beats by dre

検索対象の用語を受け取ったら、それをn-gramにトークン化し、それらを対応する場所とともに使用して、対応するn-gramファイル(存在する場合)に読み込むことができます。次に、データセット全体に対して実行する代わりに、このデータセットに対して任意のフィルタリング操作(指定された長さの範囲内にないものの削除、距離の編集計算の実行など)を実行できます。

私の質問は...まあ、私はいくつかの質問があると思います。

  1. Luceneのあいまい検索に、私のアプローチが不要になることに気付いていない改善がありましたか?
  2. これは(私が扱っているデータのセットを考慮して)あいまい検索を実装するための良いアプローチですか、それとも私が過度に単純化/欠落しているものがありますか?
4

2 に答える 2

3

Lucene 3.x ファジー クエリは、クエリされた用語とすべてのインデックス用語の間のレーベンシュタイン距離を評価するために使用されます (ブルート フォース アプローチ)。このアプローチはかなり非効率的であるため、Lucene スペルチェッカーは、あなたが説明したものに似たものに依存していました。レーベンシュタインまたはジャロウィンクラー)。

ただし、これは Lucene 4.0 で大きく変更されました ( ALPHA プレビューが数日前にリリースされました) 。FuzzyQuery は、レーベンシュタイン オートマトンを使用して用語辞書と効率的に交差するようになりました。これは非常に高速であるため、FuzzyQuery と同様に、専用のインデックスを必要とせず、用語辞書とオートマトンを直接交差させる新しいダイレクト スペルチェッカーが存在します。

于 2012-07-07T10:25:07.830 に答える
1

ちなみに、英語のコーパスを扱っているので、Lucene(またはSolrですが、バニラルセンで使用できると思います)には、役立つ可能性のある音声アナライザー(DoubleMetaphone、Metaphone、Soundex、RefinedSoundex、Caverphone)がいくつかあります。

Lucene 4.0 alphaがリリースされたばかりですが、多くのことが簡単にカスタマイズできるようになったため、それに基づいてカスタムのあいまい検索を作成することもできます。

いずれにせよ、Luceneは長年にわたってパフォーマンスが向上しているため、同じパフォーマンスを達成することはほとんどできません。もちろん、それはあなたの場合には十分かもしれません...

于 2012-07-06T17:19:59.900 に答える