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) 即可解决问题。