我正在为从数据库获取的值创建Lucene索引。我已将索引OpenMode
设为OpenMode.CREATE_OR_APPEND
。
索引创建步骤是Spring Batch Job的一部分。
我的理解是,当我第一次运行作业时,索引可能需要一段时间但是当我再次为相同的未更改的源数据重新运行作业时,它应该很快,因为文档已经存在所以 UPDATE OR INSERT 尚未执行。
但就我而言,相同的未更改源数据的后续索引尝试变得越来越慢。
对can only be 128 chars long的回答说,它会根据条款自动处理。
我不确定如何在我的案例中定义术语来处理这个问题?
以下是我的示例代码
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
来决定两面性。
我不希望重新创建索引,如果Index中已经存在完全相同的Document
,我希望跳过新的Document
(不要做任何事情)。
编辑 - 我问了一个很长的问题,但在阅读了几篇关于Lucene相关问题的SO后,我意识到我只是在寻求增量索引方法,同时专注于重复避免如果文档表示具有主键的RDBMS表的一行。如果更改了DB行,则更新文档,否则为新行添加文档。
答案 0 :(得分:5)
我已经验证在Lucene 6.0.0中,如果文档尚未存在,则IndexWriter.updateDocument(Term term,Document doc);
会添加新文档,如果根据term
找到,则会更新现有文档。
根据我的要求,我定义了一个key
字段,它基本上是Document
的所有其他值字段的串联。这种方式key
标识内容明智的重复,即对于具有相同key
的两个文档,意味着文档是内容明智的副本。
我构建term
以传递给IndexWriter.updateDocument(Term term,Document doc);
这个key
值,而只是调用IndexWriter.updateDocument(Term term,Document doc);
而不是IndexWriter.addDocument(Document doc)
来解决问题。