如何避免在Lucene 6.0中重复文档索引

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行,则更新文档,否则为新行添加文档.

问题1,问题2

Sab*_*han 6

我已经验证在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)解决问题.