3

既存の Lucene インデックスにファセットを追加する方法に少し困惑しています。

Lucene 3.1 を使用して作成された Lucene インデックス (ファセットなしで作成) があります。

ファセットに関する Lucene のドキュメントを調べたところ、ファセットを使用してインデックスをゼロから作成する方法が示されています。つまり、新しい LuceneDocumentオブジェクトを作成し、分類ツールを使用してそれにファセット情報 (カテゴリ) を追加してから、次のように記述します。そのドキュメントを Lucene インデックスに ( を使用して) 追加すると、ここで説明するように、IndexWriter( を介して) タクソノミー インデックスに追加のデータが追加されます。TaxonomyWriter

http://lucene.apache.org/core/3_6_2/api/all/org/apache/lucene/facet/doc-files/userguide.html#facet_accumulation

ただし、私が望むのは、既存の Lucene インデックスに既に格納されているデータを使用し、そこから新しい Lucene インデックスを作成することです (分類インデックスと一緒に)。これには、元のインデックスとまったく同じデータとさまざまなカテゴリが含まれます。情報。

私の質問はより正確です:

次のように、元のインデックスからドキュメントを読み取り、その CategoryPath を作成してから、新しいインデックスに書き込むだけで十分ですか。

//get a document from original Lucene index:
Query query = queryParser.parse("*:*");
originalTopDocs = originalIndexSearcher.search(query,100);
Document originalDocument = originalIndexSearcher.doc(originalTopDocs.scoreDocs[1].doc)

//create categories for original document
CategoryDocumentBuilder categoryDocBuilder = new CategoryDocumentBuilder(taxonomyWriter);
categoryDocBuilder.setCategoryPaths(categoriesPaths);

//create new document from original document + categories:
Document originalDocumentWithCategories = categoryDocBuilder.build(originalDocument);

//write new document to new index:
newIndexWriter.write(originalDocumentWithCategories);

上記のコードは、元のインデックスに保存されていたのと同じドキュメントにインデックスを付けますが、カテゴリ データが追加されていますか? たとえば、元のドキュメントの保存されていないフィールドのデータは、新しく作成され、インデックスが作成されたドキュメントにも存在しますか?

また、この更新を行うためのより良い方法はありますか (おそらく新しいインデックスを作成しないでください)...

4

1 に答える 1

1

わかりました、これが私がこれをどのように解決したかについての洞察です:

  1. (質問で説明されているように)Luceneのみでそれを行いたい場合は、次の場合にのみ行うことができます:

    • 必要なすべてのフィールドも元のインデックスに保存されています。インデックスが作成されただけで保存されていないフィールドがある場合、新しいインデックスでそれらを再インデックスするためにそれらを回復することはできません (ファセットを使用)。
    • また、元のインデックスの作成に使用されるアナライザーと、クエリの作成に使用されるアナライザーに関する知識も必要です。
      • 新しいインデックスを作成するときに (格納された値から) 同じ用語を取得するには、元のインデックス時間アナライザーが必要です。
      • 元のインデックスでクエリを作成するときにさまざまな QueryParser で使用されるアナライザーは、新しいインデックスに対して同じクエリを再構築できるようにするために必要です。

以上のことから、少なくともファセット部分については、Solr を使用して実装する方が簡単であり、少なくとも私の状況ではパフォーマンスが低下することはありませんが、実際にはパフォーマンスが向上する場合があることに気付きました。Solr の利点は、(ファセットに関連するすべてのフィールドで) ファセットを「自動的に魔法のように」作成することです。追加のファセット インデックス作成、ファセット「パス」の手動宣言などはありません。また、ファセット用の Solr クエリ API は、Lucene のものよりも使いやすくなっています。

Lucene から Solr に移行する際に発生する可能性がある問題は次のとおりです。

  • 最初の Lucene インデックスのインデックス作成とクエリに使用される Lucene アナライザーに関するすべての情報が必要です。Solr に渡すという事実は、これらの Lucene アナライザーが Solr が提供するものにどのようにマップされるかを確認するオーバーヘッドも追加します (ほとんどの Solr アナライザー/フィルターは Lucene のものと同じですが、すべてではありません)。
  • Solr には Lucene プログラムによるクエリ API がありません (これを行う方法はなくnew SpanQuery("My blue boat*")、自動で魔法のように正しいクエリ用語がバックグラウンドで作成されます)。上記のプログラムによるクエリ API を多用する Lucene クエリを Solr クエリに変換する場合は、対応する Lucene クエリ文字列を生成する独自のツールを作成する必要があります。もちろん、Lucene API を使用してクエリ オブジェクトを作成し、toString()Solr に送信する前にオブジェクトを作成することもできますが、これは常に機能するわけではなく、特定の複雑なクエリでは非常に複雑になる可能性があります。
于 2013-08-05T11:53:08.627 に答える