簡體   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