0

我刚刚将我们的 Lucene 实现从 3.1 移植到 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();
4

1 回答 1

1

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

maybeRefresh()回报是什么?如果false,则表示索引正在由不同的线程刷新(更大的索引需要时间)。在此刷新完成之前,其他线程只需要与陈旧的阅读器/搜索器一起生活。

如果您想对此进行测试,请IndexReader显式打开一个新的(不带SearcherManager)并在commit(). 我敢打赌,您会在搜索结果中看到更新的数据。

于 2014-07-18T10:02:37.237 回答