Lucene 近实时索引和非确定性getTermVector结果

Lucene 近实时索引和非确定性getTermVector结果,lucene,Lucene,我尝试使用Lucene 4.9作为索引机制,以NRT模式返回文档的术语。为此,我使用以下字段配置: FieldType t2 = new FieldType(); t2.setIndexed(true); t2.setStored(true); t2.setTokenized(true); t2.setStoreTermVectors(true); t2.setStoreTermVectorPositions(true); t2.setIn

我尝试使用Lucene 4.9作为索引机制,以NRT模式返回文档的术语。为此,我使用以下字段配置:

    FieldType t2 = new FieldType();
    t2.setIndexed(true);
    t2.setStored(true);
    t2.setTokenized(true);
    t2.setStoreTermVectors(true);
    t2.setStoreTermVectorPositions(true);
    t2.setIndexOptions(FieldInfo.IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
以及以下IndexWriterConfig:

    StandardAnalyzer analyzer = new StandardAnalyzer(VERSION);
    IndexWriterConfig config = new IndexWriterConfig(VERSION, analyzer);
我的流程如下:

   indexWriter.addDocument(doc);
   IndexReader indexReader = DirectoryReader.open(indexWriter, true);
   // ... i = find document id using indexReader
   Terms terms = handler.indexReader.getTermVector(i, CONTENTS_FIELD_NAME);
我希望在调用addDocument(doc)和IndexReader之后,能够为我提供正确填充的TermVector。在我的测试场景中,它基本上按照预期工作,但在某些情况下,TermVector的大小比它应该的小。结果不可靠且不确定(每2000个项目发生5-10次)

添加,比如说,在addDocument(doc)语句之后立即暂停500毫秒-使事情正常工作

我的假设是,字段索引是异步进行的,但NRT的IndexReader给出了指向某种程度上“不完整”快照的指针

是否有任何方法可以确保文档已被分析并确保getTermVector()将返回正确的值

更新:


在IndexReader分配之后(而不是之前)添加500毫秒暂停也有帮助。因此,这个问题似乎只与延迟/不完整的字段分析有关。

在读取之前提交索引。从中,commit()命令将所有挂起的更改(添加和删除的文档、段合并、添加的索引等)提交到索引,并同步所有引用的索引文件,以便读取器可以看到这些更改,并且索引更新将在操作系统或机器崩溃或断电后仍然有效。请注意,这不会等待任何正在运行的后台合并完成

请注意,这可能是一项成本高昂的操作,因此您应该在应用程序中测试成本,并仅在真正必要时进行测试