0

次のような特定の SQL 結合があります。

select DISTINCT ... 100 columns
from ... 10 tabes, some left joins

現在、Toad を使用してこのクエリの結果を XML にエクスポートしています (後で Java から直接クエリを実行します)。Java を使用して XML ファイルを解析し、Lucene (Java) を使用してインデックスを作成し、Lucene インデックスを検索します。これはうまく機能します。データベースからクエリを実行するよりも 6 ~ 10 倍速く結果が得られます。

データベース内のデータが変更されたときに、このインデックスを段階的に更新する方法を考える必要があります。

テーブルを結合しているため (特に左結合)、増分更新を行うための一意のビジネス キーの組み合わせを取得できるかどうかわかりません。一方、私は DISTINCT を使用しているため、すべてのフィールドが一意の組み合わせであることを知っています。この情報を考慮してhashCode、ドキュメントの をドキュメントのフィールドとして配置し、次updateDocumentIndexWriterように呼び出すことができると考えました。

public static void addDoc(IndexWriter w, Row row) throws IOException {
    //Row is simply a java representation of a single row from the above query
    Document document = new Document();
    document.add(new StringField("fieldA", row.fieldA, Field.Store.YES));
    ...
    String hashCode = String.valueOf(document.hashCode());
    document.add(new StringField("HASH", hashCode, Field.Store.YES));
    w.updateDocument(new Term("HASH", hashCode), document);
}

その後、ハッシュコードが一致するドキュメントを実際に削除し、同じドキュメントを再度追加していることに気付いたupdateDocumentので、これは役に立ちませんでした。

これにアプローチする方法は何ですか?

4

2 に答える 2

0

Lucene には、ドキュメントを「更新」するという概念はありません。したがって、更新または追加は、基本的に削除 + 追加です。

ここで進行状況を追跡できます - https://issues.apache.org/jira/browse/LUCENE-4258

したがって、アプリで doc.hashCode() のロジックを保持する必要があります。つまり、値が変更されていないことがわかっている場合は、lucene にドキュメントのインデックスを作成するように依頼しないでください (一連の hashCode 値を使用でき、それが一致する場合は、ドキュメントは変更されていません)。削除を追跡するためのロジックも必要になる場合があります

于 2013-09-28T03:35:40.630 に答える
0

ソース DB テーブルの関連する更新ごとに ID をインクリメントし、レコードの削除時にこれらの ID をログに記録すると、

その後、索引付けされているデータの削除、更新、および新規レコードをリストできるはずです。

このステップは一時テーブル内で実行され、それ自体が lucene への入力として使用される xml ファイルに抽出されます。

于 2016-10-08T15:13:20.393 に答える