IndexWriter.commit()不足以改变索引

时间:2014-07-17 20:19:59

标签: java lucene indexwriter

我刚刚将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();

1 个答案:

答案 0 :(得分:1)

提交后索引已更改,SearcherManager会给您错误的印象。

maybeRefresh()返回什么?如果false,则表示索引 正由另一个线程刷新(这需要更长的索引时间)。在此次更新完成之前,其他线程只需要与陈旧的读者/搜索者一起生活。

如果您要对此进行测试,请明确打开一个新的IndexReader(不使用SearcherManager)并在commit()之后进行查询。我敢打赌你会在搜索结果中看到更新的数据。