web-dev-qa-db-ja.com

Luceneの仕組み

Lucene検索がどのように高速に機能するかを知りたいと思います。ウェブ上で有用なドキュメントが見つかりません。読みたいもの(luceneソースコードが不足している)があれば、お知らせください。

私の場合、インデックス付きmysql5テキスト検索を使用したテキスト検索クエリには約18分かかります。同じクエリのlucene検索には1秒もかかりません。

85
Midhat

Luceneは逆方向フルテキストインデックスです。これは、すべてのドキュメントを取得し、それらを単語に分割し、インデックスを作成することを意味します各単語に対して。インデックスは、文字列と完全に一致し、順序付けられていないため、非常に高速です。仮に、varcharフィールドのSQL順不同インデックスも同じくらい高速である可能性があります。実際、この場合、大きなデータベースが単純な文字列平等クエリを非常に迅速に実行できると思います。

Luceneは、トランザクション処理のために最適化する必要はありません。ドキュメントを追加するとき、クエリがそれを参照することを保証する必要はありませんinstantly。また、既存のドキュメントの更新を最適化する必要はありません。

ただし、結局のところ、本当に知りたい場合は、ソースを読む必要があります。結局のところ、参照するものは両方ともオープンソースです。

72
bmargulies

Luceneは大きなインデックスを作成します。インデックスには、Word ID、Wordが存在するドキュメントの数、およびそれらのドキュメント内のWordの位置が含まれます。したがって、単一のWordクエリを指定すると、インデックスが検索されます(O(1)時間の複雑さ)。次に、異なるアルゴリズムを使用して結果がランク付けされます。マルチワードクエリの場合は、ワードが存在するファイルセットの共通部分を取得します。したがって、Luceneは非常に高速です。

詳細については、Google開発者によるこの記事をお読みください http://infolab.stanford.edu/~backrub/google.html

32
alienCoder

一言で言えば:インデックス作成。

Luceneは、ドキュメントのインデックスを作成して、ドキュメントをより迅速に検索できるようにします。

リストO(N)データ構造とハッシュテーブルO(1)データ構造の違いは同じです。リストは全体をウォークスルーする必要がありますハッシュテーブルには、目的のアイテムがどこにあるかを正確に把握し、単純にそれをフェッチできるインデックスがあります。

更新:

「Luceneインデックス検索はmysqlインデックス検索よりもはるかに高速です」という意味がわかりません。

私の推測では、MySQLを使用して「WHERE document LIKE '%phrase%'」を検索します。その場合、MySQLはすべての行でテーブルスキャンを実行する必要があります。これはO(N)になります。

Luceneは、ドキュメントをトークンに解析し、それらをあなたの指示でn-gramにグループ化し、それらのそれぞれのインデックスを計算します。 O(1)は、インデックス付きLucene文書でWordを見つけるためのものです。

18
duffymo

Luceneは用語頻度と逆文書頻度で動作します。各Wordをドキュメントにマッピングするインデックスを作成し、ドキュメント上の逆インデックスに他ならない頻度カウントです。

ファイル1:ランダムアクセスメモリがメインメモリです。

ファイル2:ハードディスクはセカンダリメモリです。

Luceneは逆インデックスを作成します

ファイル1:

用語:ランダム

頻度:1

位置:0

用語:メモリ

頻度:2

ポジション:3

ポジション:6

したがって、検索されたコンテンツをすばやく検索および取得できます。検索クエリに対して一致が多すぎる場合、重みに基づいて結果を出力します。検索クエリ "Main Memory"を検討してください。4つの単語すべてを個別に検索すると、結果は次のようになります。

メイン

ファイル1:頻度-1

メモリ

ファイル1:頻度-2

ファイル2:頻度-1

結果はFile1に続いてFile2になります。 「and」、「or」、「the」などの最も一般的な単語の重みに夢中にならないように、逆文書頻度を考慮します(つまり、文書セットの中で最も人気のあるWordの重みを減らします)。

4
rm -rf star