我刚刚将3.1版本的Lucene实现移植到4.9,如果没有forceMerge(1)(以前是优化),我似乎仍然无法更新索引中的文档。据我所知,每当我更新文档时,旧文档都被标记为已删除,新文档将存储在新的段/文件中。即使在升级之后我仍然看到的结果是文档被标记为已删除,但搜索者似乎从未看到过新的段。搜索该文档只是空的。为什么不起作用?
代码我期望工作:
IndexWriter indexWriter =
new IndexWriter(FSDirectory.open(indexDirectoryFile),
getIndexWriterConfig());
Document document = buildDocument(p);
indexWriter.updateDocument(
new Term(SKU_FIELD_NAME, p.getSku().toString()), document);
indexWriter.commit();
indexWriter.close();
searcherManager.maybeRefresh();
有效的代码:
IndexWriter indexWriter =
new IndexWriter(FSDirectory.open(indexDirectoryFile),
getIndexWriterConfig());
Document document = buildDocument(p);
indexWriter.updateDocument(
new Term(SKU_FIELD_NAME, p.getSku().toString()), document);
indexWriter.commit();
**indexWriter.forceMerge(1,true);**
indexWriter.close();
searcherManager.maybeRefresh();
答案 0 :(得分:1)
提交后索引已已更改,SearcherManager
会给您错误的印象。
maybeRefresh()
返回什么?如果false
,则表示索引 正由另一个线程刷新(这需要更长的索引时间)。在此次更新完成之前,其他线程只需要与陈旧的读者/搜索者一起生活。
如果您要对此进行测试,请明确打开一个新的IndexReader
(不使用SearcherManager
)并在commit()
之后进行查询。我敢打赌你会在搜索结果中看到更新的数据。