我正在爲從數據庫獲得的值創建一個Lucene索引。我已將Index OpenMode
設置爲OpenMode.CREATE_OR_APPEND
。如何避免在Lucene 6.0中重複文檔索引
索引創建步驟是Spring Batch Job的一部分。
我的理解是,當我第一次運行作業,索引可能需要一段時間,但是當我再次重新運行該作業的同樣不變的源數據,應該是快,因爲文件已經存在,那麼更新或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
被跳過(不要執行任何操作)。
編輯 -我問了一個很長的問題,但SO閱讀一些Lucene的相關問題後,我意識到,我只是要求增量索引辦法同時注重複製避免提供的文件是一個RDBMS的行表具有主鍵。如果數據庫行已更改,請更新文檔,否則不要添加新文檔。
'id'字段標識文檔。如果沒有唯一的ID,那麼您需要在導入前使用自己的邏輯進行檢查。 –
我該如何編寫'Document'的'id'。在這種情況下,所有「Fields」組合標識一個「Document」。我想,我需要定義一些類似'新術語(...,...)' –
不,如果您使用的是SolrJ,指定文檔的id,只需創建一個'SolrInputDocument',並設置id字段'doc.setField( 「ID」,...);' –