我有简单的迭代和更新文档代码。索引太大 - 数百万个文档,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
答案 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));
}