繁体   English   中英

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

[英]How to iterate and update documents over lucene documents?

我有用于迭代和更新文档的简单代码。 索引太大–数百万个文档,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已与初始化的阅读器正常工作。 但是与阅读器相关的索引段(文件)在打开阅读器之前不会被删除,并且索引大小在每次更新迭代时都会加倍。 经过一天的工作,索引大小为TB! 如果关闭所有读取器和写入器,然后重新打开索引-旧段将被删除。 如何正确地迭代和更新文档而不会泄漏磁盘文件?

我使用Java 1.7,Lucene 4.8

我找到的最佳解决方案-使用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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM