我正在尝试使用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()将返回正确的值?
更新
添加500毫秒暂停后(而不是之前) IndexReader 分配也有帮助。因此,这个问题似乎只与延迟/不完整的现场分析有关。
答案 0 :(得分:0)
在阅读前提交索引。从API reference,commit()命令将所有挂起的更改(添加和删除的文档,段合并,添加的索引等)提交到索引,并同步所有引用的索引文件,以便读者可以看到更改和索引更新将在操作系统或计算机崩溃或断电后继续存在。请注意,这不会等待任何正在运行的后台合并完成。
请注意,这可能是一项代价高昂的操作,因此您应该在应用程序中测试成本,并且只在真正需要时才进行。