我有一些文档存储在Lucene索引中,其中包含docId字段。我想获取存储在该索引中的所有docIds。然而,存在一个问题,即文档数量约为300,000,因此我希望以500为大小的块来获取这些docIds。是否可以这样做?
我有一些文档存储在Lucene索引中,其中包含docId字段。我想获取存储在该索引中的所有docIds。然而,存在一个问题,即文档数量约为300,000,因此我希望以500为大小的块来获取这些docIds。是否可以这样做?
IndexReader reader = // create IndexReader
for (int i=0; i<reader.maxDoc(); i++) {
if (reader.isDeleted(i))
continue;
Document doc = reader.document(i);
String docId = doc.get("docId");
// do something with docId here...
}
Lucene 4
Bits liveDocs = MultiFields.getLiveDocs(reader);
for (int i=0; i<reader.maxDoc(); i++) {
if (liveDocs != null && !liveDocs.get(i))
continue;
Document doc = reader.document(i);
}
详细信息请参见此页面上的LUCENE-2600:https://lucene.apache.org/core/4_0_0/MIGRATE.html
MultiBits.getLiveDocs(reader)
。 - Vlad有一个名为MatchAllDocsQuery
的查询类,我认为它可以在这种情况下使用:
Query query = new MatchAllDocsQuery();
TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT);
文档编号(或ID)将是从0到IndexReader.maxDoc()-1的连续数字。这些数字不是持久的,只在打开的IndexReader中有效。您可以使用IndexReader.isDeleted(int documentNumber)方法检查文档是否已删除。
IndexReader reader = // create IndexReader
for (int i=offset; i<offset + 10; i++) {
if (reader.isDeleted(i))
continue;
Document doc = reader.document(i);
String docId = doc.get("docId");
}
你会遇到一些问题,因为你不应该从offset=60开始,而是应该从offset=60加上在60之前出现的已删除文档数量。
我发现的另一种替代方法是这样的:
is = getIndexSearcher(); //new IndexSearcher(indexReader)
//get all results without any conditions attached.
Term term = new Term([[any mandatory field name]], "*");
Query query = new WildcardQuery(term);
topCollector = TopScoreDocCollector.create([[int max hits to get]], true);
is.search(query, topCollector);
TopDocs topDocs = topCollector.topDocs(offset, count);
注意:将 [[ ]] 中的文本替换为自己的值。 在包含150万条目的大索引上运行此操作,不到一秒钟即可获得10个随机结果。 使用 Agree 更慢,但如果需要分页,则至少可以忽略已删除的文档。