Sab*_*han 2 java lucene spring-batch
我正在为从数据库获取的值创建一个Lucene索引.我把Index OpenMode设为OpenMode.CREATE_OR_APPEND.
索引创建步骤是Spring Batch Job的一部分.
我的理解是,当我第一次运行作业时,索引可能需要一段时间,但是当我再次为相同的未更改的源数据重新运行作业时,它应该很快,因为文档已经存在,因此没有执行UPDATE OR INSERT.
但对于我的情况,后续索引尝试相同的未更改的源数据变得越来越慢.
回答这个问题说它会根据一个术语自动处理.
我不确定如何在我的案例中定义术语来处理这个问题?
以下是我的示例代码,
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;
}
Run Code Online (Sandbox Code Playgroud)
当源数据没有变化时,我应该在上面的代码中更改什么不执行索引?
我是Lucene的初学者,不确定如何定义Term哪个会决定两面性.
我不希望重新创建索引,并且Document如果DocumentIndex中已经存在完全相同的话,我希望跳过新的(不要做任何事情).
编辑 -我问了一个很长的问题但是在阅读了几个与Lucene相关的问题之后,我意识到我只是在寻求增量索引方法,同时专注于重复避免,只要文档代表一行具有主键的RDBMS表.如果更改了DB行,则更新文档,否则为新行添加文档.
我已经验证在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)解决问题.
| 归档时间: |
|
| 查看次数: |
2173 次 |
| 最近记录: |