如何在lucene文档上迭代和更新文档?

时间:2014-05-17 12:10:28

标签: java lucene

我有简单的迭代和更新文档代码。索引太大 - 数百万个文档,10-20gb。 这是一个伪代码:

liveDocs = MultiFields.getLiveDocs(reader);
docsEnum = MultiFields.getTermDocsEnum(reader, 
  MultiFields.getLiveDocs(reader), field, bytesRef);
while ((doc = docsEnum.nextDoc()) != DocsEnum.NO_MORE_DOCS) {
  oldDocument = reader.document(doc);
  // some updates
  writer.updateDocument(term, newDocument, analyzer);
  break;
  // simple flush policy
  if(doc % 10000 == 0){
    writer.commit();
  }
}

DocsEnum正常与读者合作,它已经初始化了。但是在阅读器打开之前,读取器索引段(文件)的相关性并未被删除,并且每次更新迭代时索引大小都会加倍。经过一天的工作,索引大小是太字节! 如果关闭所有读者和写入,并重新打开索引 - 旧段将被删除。 如何正确迭代&没有磁盘文件泄漏更新文件?

我使用java 1.7,lucene 4.8

1 个答案:

答案 0 :(得分:0)

我找到的最佳解决方案 - 使用IndexSearcher.search()&& IndexSearcher.searchAfter()。

这样的事情:

// inside iterator
TopDocs docs;
if (lastScore == null) {
    docs = searcher.search(query, filter, limit, Sort.INDEXORDER, false, false);
} else {
    docs = searcher.searchAfter(lastScore, query, filter, limit, Sort.INDEXORDER, false, false);
}
lastScore = docs.scoreDocs[docs.scoreDocs.length - 1];
for (ScoreDoc scoreDoc : docs.scoreDocs) {
    Document = searcher.doc(scoreDoc.doc, fields));
}