現在取り組んでいるWebアプリにあいまい検索機能を実装したいと思います。バックエンドはJavaであり、ここで誰もが推奨する検索エンジンであるLuceneもJavaでコーディングされています。しかし、私はいくつかの理由でそれを使用することを躊躇しています:
- 自分で何かを作ることができたと感じます。
- Luceneには、自分では利用していない機能がたくさんあります。膨満感を最小限に抑えたいのですが。
- 私が理解していることから、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ファイル(存在する場合)に読み込むことができます。次に、データセット全体に対して実行する代わりに、このデータセットに対して任意のフィルタリング操作(指定された長さの範囲内にないものの削除、距離の編集計算の実行など)を実行できます。
私の質問は...まあ、私はいくつかの質問があると思います。
- Luceneのあいまい検索に、私のアプローチが不要になることに気付いていない改善がありましたか?
- これは(私が扱っているデータのセットを考慮して)あいまい検索を実装するための良いアプローチですか、それとも私が過度に単純化/欠落しているものがありますか?