Lucene 6.0 中如何避免重复文档索引
How to avoid duplicate document indexing in Lucene 6.0
我正在为从数据库中获取的值创建一个 Lucene 索引。我已将索引 OpenMode
设置为 OpenMode.CREATE_OR_APPEND
。
索引创建步骤是 Spring 批处理作业的一部分。
我的理解是,当我第一次 运行 工作时,索引可能需要一段时间,但当我重新运行 工作时 相同的未更改源数据,它应该很快,因为文档已经存在,所以 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
(不要做任何事情)。
编辑 - 我问了一个很长的问题,但是在阅读了一些与 Lucene 相关的问题之后,我意识到我只是在要求 增量索引 方法,同时专注于避免重复,前提是文档代表具有主键的 RDBMS table 的一行。如果数据库行发生变化,则不更新文档,并为新行添加文档。
Question 1,Question 2
我已验证在 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)
即可解决问题。
我正在为从数据库中获取的值创建一个 Lucene 索引。我已将索引 OpenMode
设置为 OpenMode.CREATE_OR_APPEND
。
索引创建步骤是 Spring 批处理作业的一部分。
我的理解是,当我第一次 运行 工作时,索引可能需要一段时间,但当我重新运行 工作时 相同的未更改源数据,它应该很快,因为文档已经存在,所以 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
(不要做任何事情)。
编辑 - 我问了一个很长的问题,但是在阅读了一些与 Lucene 相关的问题之后,我意识到我只是在要求 增量索引 方法,同时专注于避免重复,前提是文档代表具有主键的 RDBMS table 的一行。如果数据库行发生变化,则不更新文档,并为新行添加文档。
Question 1,Question 2
我已验证在 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)
即可解决问题。