[英]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.