web-dev-qa-db-ja.com

luceneはどのようにドキュメントにインデックスを付けますか?

Luceneに関するドキュメントを読みました。また、このリンクのドキュメントを読みます( http://lucene.sourceforge.net/talks/pisa )。

Luceneがドキュメントのインデックスを作成する方法を実際に理解しておらず、Luceneがインデックス作成に使用するアルゴリズムを理解していませんか?

上記のリンクでは、Luceneはこのアルゴリズムをインデックス作成に使用すると述べています。

  • 増分アルゴリズム:
    • セグメントインデックスのスタックを維持する
    • 着信ドキュメントごとにインデックスを作成します
    • 新しいインデックスをスタックにプッシュします
    • b = 10をマージファクターとします。 M = 8

for (size = 1; size < M; size *= b) {
    if (there are b indexes with size docs on top of the stack) {
        pop them off the stack;
        merge them into a single index;
        Push the merged index onto the stack;
    } else {
        break;
    }
}

このアルゴリズムはどのように最適化されたインデックスを提供しますか?

Luceneは、インデックス付けにBツリーアルゴリズムやその他のアルゴリズムを使用していますか?それとも特定のアルゴリズムを使用していますか?

86
Mehdi Amrollahi

ここにはかなり良い記事があります: https://web.archive.org/web/20130904073403/http://www.ibm.com/developerworks/library/wa-lucene/

編集12/2014:オリジナルが削除されたため、アーカイブバージョンに更新されました。おそらく最も新しい代替手段は http://lucene.Apache.org/core/3_6_2/fileformats.html です。

http://lucene.Apache.org/core/4_10_2/core/org/Apache/lucene/codecs/lucene410/package-summary.html#package_description にはさらに新しいバージョンがありますが、古い情報よりも情報が少ないようです。

一言で言えば、luceneがドキュメントのインデックスを作成すると、ドキュメントはいくつかの用語に分解されます。次に、各用語が含まれるドキュメントに関連付けられているインデックスファイルに用語を保存します。ハッシュテーブルのようなものと考えることができます。

用語は、各Wordをルート形式に変換するアナライザーを使用して生成されます。英語の最も一般的なステミングアルゴリズムは、Porterステミングアルゴリズムです。 http://tartarus.org/~martin/PorterStemmer/

クエリが発行されると、インデックスの作成に使用されたのと同じアナライザーで処理され、インデックス内の一致する用語の検索に使用されます。これにより、クエリに一致するドキュメントのリストが提供されます。

53
Darren

インデックス自体についてではなく、インデックスのマージについての質問のようです。

低レベルの詳細を無視する場合、インデックス作成プロセスは非常に簡単です。 Luceneは、文書から「逆索引」と呼ばれるものを形成します。したがって、テキスト「to be or not to」およびid = 1が含まれるドキュメントが入った場合、逆索引は次のようになります。

[to] → 1
[be] → 1
[or] → 1
[not] → 1

これは基本的に、Wordから特定のWordを含むドキュメントのlistへのインデックスです。このインデックスの各行(Word)は、投稿リストと呼ばれます。このインデックスは、その後、長期ストレージに保持されます。

もちろん、実際にはもっと複雑です。

  • Luceneは、指定された特定のアナライザーに基づいていくつかの単語をスキップする場合があります。
  • 言語のフレキシマを減らすために、ステミングアルゴリズムを使用して単語を前処理できます。
  • 投稿リストには、ドキュメントの識別子だけでなく、ドキュメント内の特定のWord(場合によっては複数のインスタンス)のオフセットとその他の追加情報を含めることができます。

基本的な理解にはそれほど重要ではない、さらに多くの合併症があります。

ただし、Luceneインデックスは追加のみであることを理解することが重要です。ある時点で、アプリケーションはインデックス内のすべての変更をコミット(公開)することを決定します。 Luceneはすべてのサービス操作をインデックスで終了して閉じますので、検索に使用できます。コミット後、インデックスは基本的に不変です。このインデックス(またはインデックス部分)は、セグメントと呼ばれます。 Luceneはクエリの検索を実行すると、利用可能なすべてのセグメントを検索します。

そこで疑問が生じます。どうすれば既にインデックス化されたドキュメントを変更する

新しいドキュメントまたは既にインデックスが作成されたドキュメントの新しいバージョンは、新しいセグメントでインデックスが作成され、古いバージョンではいわゆるkill listを使用して以前のセグメントで無効化されます。キルリストは、変更可能なコミット済みインデックスの唯一の部分です。ご想像のとおり、古いインデックスにはほとんど削除されたドキュメントが含まれている可能性があるため、インデックスの効率は時間とともに低下します。

これがマージの出番です。マージ–いくつかのインデックスを組み合わせて、インデックス全体をより効率的にするプロセスです。マージ中に基本的に行われるのは、ライブドキュメントが新しいセグメントにコピーされ、古いセグメントが完全に削除されることです。

この単純なプロセスを使用して、Luceneは検索パフォーマンスの観点からインデックスを良好な状態に維持できます。

それが役に立てば幸いです。

22
Denis Bazhenov

逆インデックス ですが、使用する構造を指定しません。 luceneのインデックス形式 には完全な情報があります。
「ファイル拡張子の概要」から始めます。

まず、さまざまなインデックスについて説明していることに気付くでしょう。厳密に言えば B-tree を使用しているこれらの使用法に気付かない限り、類似点があります-上記の構造は木に似ています。

12
Unreason