lucene検索がどのように高速に機能するかを知りたいのですが。ウェブ上で役立つドキュメントが見つかりません。(luceneのソースコード以外の)読むものがあれば、私に知らせてください。
インデックス付きのmysql5テキスト検索を使用したテキスト検索クエリは、私の場合約18分かかります。同じクエリのLucene検索には1秒もかかりません。
回答:
Luceneは、反転した全文索引です。つまり、すべてのドキュメントを取得し、それらを単語に分割して、各単語のインデックスを作成します。インデックスは、文字列が完全に一致し、順序付けされていないため、非常に高速です。仮に、varchar
フィールドのSQLの順序付けられていないインデックスも同じくらい高速である可能性があり、実際、その場合、大きなデータベースが単純な文字列等価クエリを非常に迅速に実行できることがわかります。
Luceneはトランザクション処理用に最適化する必要はありません。ドキュメントを追加するときに、クエリがドキュメントを即座に表示することを保証する必要はありません。また、既存のドキュメントの更新を最適化する必要もありません。
しかし、結局のところ、本当に知りたいのであれば、ソースを読む必要があります。結局のところ、あなたが参照するものはどちらもオープンソースです。
Luceneは大きなインデックスを作成します。インデックスには、単語ID、単語が存在するドキュメントの数、それらのドキュメント内での単語の位置が含まれます。したがって、1つの単語のクエリを指定すると、インデックス(O(1)時間の複雑さ)のみが検索されます。次に、さまざまなアルゴリズムを使用して結果がランク付けされます。複数単語のクエリの場合、単語が存在するファイルのセットの共通部分を取得するだけです。したがって、Luceneは非常に高速です。
詳細については、Google開発者によるこの記事をご覧ください-http://infolab.stanford.edu/~backrub/google.html
つまり、索引付けです。
Luceneは、ドキュメントのインデックスを作成して、ドキュメントをより迅速に検索できるようにします。
これは、リストO(N)データ構造とハッシュテーブルO(1)データ構造の違いと同じです。リストは、コレクション全体を調べて、必要なものを見つける必要があります。ハッシュテーブルにはインデックスがあり、目的のアイテムがどこにあるかを正確に把握し、簡単にフェッチできます。
更新:
「Luceneインデックス検索はmysqlインデックス検索よりもはるかに高速です」という意味がわかりません。
私の推測では、MySQL "WHERE document LIKE '%phrase%'"を使用してドキュメントを検索していると思います。これが真の場合、MySQLはO(N)になるすべての行でテーブルスキャンを実行する必要があります。
Luceneはドキュメントをトークンに解析し、それらをユーザーの指示でn-gramにグループ化し、それぞれのインデックスを計算します。インデックス付きLuceneドキュメントで単語を検索するのはO(1)です。
Luceneは、用語の頻度と逆ドキュメントの頻度で動作します。これは、各単語をドキュメントにマッピングするインデックスを作成し、その頻度カウントはドキュメントの逆インデックスにすぎません。
例:
ファイル1:ランダムアクセスメモリはメインメモリです。
ファイル2:ハードディスクは二次メモリです。
Luceneは次のような逆インデックスを作成します
ファイル1:
用語:ランダム
頻度:1
位置:0
用語:メモリ
頻度:2
ポジション:3
ポジション:6
そのため、検索されたコンテンツをすばやく検索して取得できます。検索クエリの一致が多すぎる場合、重みに基づいて結果を出力します。「メインメモリ」という検索クエリを考えてみましょう。4つの単語すべてを個別に検索すると、結果は次のようになります。
メイン
ファイル1:頻度-1
記憶
ファイル1:頻度-2
ファイル2:頻度-1
結果はFile1の後にFile2が続きます。「and」、「or」、「the」などの最も一般的な単語の重みに夢中にならないようにするために、逆のドキュメント頻度を考慮します(つまり、ドキュメントセットで最も人気のある単語の重みを減らします)。