データベースから取得した値のLuceneインデックスを作成しています。私はインデックスOpenMode
をOpenMode.CREATE_OR_APPEND
と設定しました。Lucene 6.0の重複したドキュメントのインデックス作成を避ける方法
索引作成ステップは、バッチ・バッチ・ジョブの一部です。
私の理解では、私が最初にジョブを実行する場合、インデックスはしばらく時間がかかるかもしれませんが、私は同じ未変更のソースデータのために再びジョブを再実行したときに文書がすでに存在するため、それが高速であるべきであるということであるので、UPDATE OR INSERTは実行されていません。
私の場合、の同じ変更されていないソースデータの後続のインデックス作成の試みは、遅くなり、遅くなります。
への回答this questionは、用語に基づいて自動的にが処理されると言います。
これを処理するために私の場合に用語を定義する方法はわかりません。以下は
私のサンプルコードは、私は元データに変化がないとき、インデックス作成を行わないために、上記のコードに変更する必要がありますどのような
public Integer createIndex(IndexWriter writer, String str, LuceneIndexerInputVO luceneInputVO) throws Exception {
Integer count = 0;
Document d = null;
txtFieldType.setTokenized(false);
strFieldType.setTokenized(false);
List<IndexVO> indexVO = null;
indexVO = jdbcTemplate.
query(Constants.SELECT_FROM_TABLE1,
new Object[] {luceneInputVO.getId1(), luceneInputVO.getId2(), str},
new IndexRowMapper());
while (!indexVO.isEmpty()) {
d = new Document();
d.add(getStringField(Constants.ID, String.valueOf(luceneInputVO.getId())));
.....
....
writer.addDocument(d);
indexVO.remove(indexVO.get(count));
count++;
}
return count;
}
?
私はLuceneの初心者であり、二重性を決定する方法はTerm
を定義する方法は不明です。
インデックスを再作成する必要はありません。Document
がインデックスに既に存在する場合は、新しいDocument
をスキップする(何もしない)ことをお勧めします。
EDIT -私は長い質問をしますが、いくつかのLuceneに関する質問のためのSO読んだ後、私は重複の回避に焦点を当てたが、文書がRDBMSの列を表している間、私は単に増分インデックスアプローチを求めていますことを実現主キーを有するテーブル。 DB行が変更されている場合は、そうでない場合はドキュメントを更新し、新しい行のドキュメントを追加します。
'id'フィールドはドキュメントを識別します。一意のIDがない場合は、インポートする前に独自のロジックで確認する必要があります。 –
'Document'の' id'をどのようにコードするのですか?この場合、すべての 'Fields'を組み合わせると' Document'が識別されます。私は、 'new Term(...、...)'のようなものを定義する必要があると思います。 –
いいえ、SolrJを使用している場合は、ドキュメントのIDを指定するために、単に 'SolrInputDocument'を作成し、 'doc.setField( "ID"、...);' –