Luceneの仕組み


90

lucene検索がどのように高速に機能するかを知りたいのですが。ウェブ上で役立つドキュメントが見つかりません。(luceneのソースコード以外の)読むものがあれば、私に知らせてください。

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


2
この質問をコミュニティーWikiに変換するように要求できますか?Luceneはプラットフォームのように聞こえます。
asyncwait 2014

回答:


75

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

Luceneはトランザクション処理用に最適化する必要はありません。ドキュメントを追加するときに、クエリがドキュメントを即座に表示することを保証する必要はありません。また、既存のドキュメントの更新を最適化する必要もありません。

しかし、結局のところ、本当に知りたいのであれば、ソースを読む必要があります。結局のところ、あなたが参照するものはどちらもオープンソースです。


私が正しく理解していれば、テキスト検索エンジンを際立たせるのは、複数の単語を検索し、検索結果をリアルタイムで複数のインデックスに結合する方法です。これについてLuceneのソースに相談することはお勧めしません。おそらくテキスト検索理論について少し読んだ方がいいでしょう。@ alienCoderの回答が役に立ちました。
Chris Dutrow、

1
@bmargulies、インデックスが「単語単位」の場合、stackoverflowユーザー検索stackoverflow.com/usersが部分文字列の一致を許可するのはなぜですか?
Pacerier 2014

2
これは本全体の答えの場所ではありません。そこには、基本的な概念についての詳細がいくつもあります。
bmargulies 2014

「各単語のインデックス」とはどういう意味ですか...「abc」と入力し始めると、ドキュメントで「abc」をどのように見つけるのですか。
Alexander Mills

1
単語からドキュメントへのインデックス(Bツリー)は、ドキュメント内の単語でドキュメントを検索できます。そのようなインデックスのテーブルは、インデックスが単語列にある(単語、ドキュメント)だからです。「「警察」、「犯罪」、「統計」という単語を含むドキュメントを検索する」のようなクエリを考えます。単語インデックスを検索することにより、3つのlog(N)検索を実行して、それらの単語の1つを含むO(N)ドキュメントを取得できます。次に、2つのO(N)ループを実行して、3つの単語すべてを含むドキュメントを含むセットを作成できます。これは理論的にはO(N)操作ですが、ほとんどの文書はとてもそのO(n)は、ここで、n <Nのすべての3つの単語を持っていない
Calicoder

34

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

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


8
その紙にざっと目を通し、それはかなり役に立ちました。具体的には、「4.5検索」が私が探していた答えでした。具体的には、個々の単語に対してO(1)ハッシュ検索が使用されているようですが、O(n)スキャンを使用して、結果を40,000ドキュメントの制限で結合します。map-reduceアルゴリズムを使用してこの作業を分割し、ユーザーが瞬時に結果を得ると想定しています。
Chris Dutrow、

人気のあるアルゴリズムの1つは、鳩ランクアルゴリズムです。よく分からないけど。
alienCoder 2014

3
その論文は面白いです:「この論文では、Googleのプロトタイプを紹介します...」。Googleが常に大企業であるとは限らなかったと思います。
Buttons840 14

Luceneを知りませんが、1つの質問:ランキングは検索ごとに発生しますか?または、事前にランク付けされたドキュメントを維持しますか?ランクごとにドキュメントを事前に維持している場合、複数の単語のクエリに対してどのように維持しますか?
Vikas Prasad

リンクが壊れています。@alienCoder
CEGRD

20

つまり、索引付けです。

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

これは、リストO(N)データ構造とハッシュテーブルO(1)データ構造の違いと同じです。リストは、コレクション全体を調べて、必要なものを見つける必要があります。ハッシュテーブルにはインデックスがあり、目的のアイテムがどこにあるかを正確に把握し、簡単にフェッチできます。

更新:

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

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

Luceneはドキュメントをトークンに解析し、それらをユーザーの指示でn-gramにグループ化し、それぞれのインデックスを計算します。インデックス付きLuceneドキュメントで単語を検索するのはO(1)です。


10
はい、私はインデックス作成の部分を理解していますが、やはり、luceneインデックス検索はmysqlインデックス検索よりもはるかに高速です。それはどのように起こりますか
ミッドハット2010

8

Luceneは、用語の頻度と逆ドキュメントの頻度で動作します。これは、各単語をドキュメントにマッピングするインデックスを作成し、その頻度カウントはドキュメントの逆インデックスにすぎません。

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

ファイル2:ハードディスクは二次メモリです。

Luceneは次のような逆インデックスを作成します

ファイル1:

用語:ランダム

頻度:1

位置:0

用語:メモリ

頻度:2

ポジション:3

ポジション:6

そのため、検索されたコンテンツをすばやく検索して取得できます。検索クエリの一致が多すぎる場合、重みに基づいて結果を出力します。「メインメモリ」という検索クエリを考えてみましょう。4つの単語すべてを個別に検索すると、結果は次のようになります。

メイン

ファイル1:頻度-1

記憶

ファイル1:頻度-2

ファイル2:頻度-1

結果はFile1の後にFile2が続きます。「and」、「or」、「the」などの最も一般的な単語の重みに夢中にならないようにするために、逆のドキュメント頻度を考慮します(つまり、ドキュメントセットで最も人気のある単語の重みを減らします)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.