我有一些文档存储在一个docId字段的Lucene索引中。 我想获取索引中存储的所有docIds。还有一个问题。文件数量约为300 000份,所以我宁愿将这些文件分成500份大小的文件。是否可以这样做?是否可以遍历Lucene索引中存储的文档?
回答
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...
}
文档编号(或ids)将是从0到IndexReader.maxDoc() - 1的后续编号。这些数字不是持久的,只对打开的IndexReader有效。你可以检查文档是否与IndexReader.isDeleted(INT documentNumber)方法删除
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
这是由其他用户回滚,但原始编辑器是正确的,liveDocs可以为null – bcoughlan 2013-11-01 15:24:49
如果您使用.document(i),如上面的示例中所示,并跳过删除的文档,请小心如果您使用此方法对结果进行分页。 即:您有10个文档/每个页面列表,您需要获取文档。对于第6页。您的输入可能是这样的:offset = 60,count = 10(文档从60到70)。
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");
}
你将有一些问题,删除的文件,因为你不应该从开始偏移量= 60,但是从偏移量= 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条结果。 同意速度较慢,但如果您需要分页,至少您可以忽略已删除的文档。
还有查询类命名MatchAllDocsQuery
,我认为它可以在这种情况下使用:
Query query = new MatchAllDocsQuery();
TopDocs topDocs = getIndexSearcher.search(query, RESULT_LIMIT);
- 1. 是否可以将文档字段存储在SearchKit索引中?
- 2. lucene是否在搜索时遍历整个倒排索引?
- 3. 是否有可能改变Lucene索引中的文档排名?
- 4. Lucene的倒排索引是否存储在内存中?
- 5. 是否有可能为Lucene来索引只存储在一个文件中
- 6. SOLR模式 - 存储文档Id字段。在Lucene索引文件
- 7. Lucene更新文档索引
- 8. 是否可以遍历JSON来查找属性是否存在?
- 9. 是否可以遍历存储在元组中的函数列表?
- 10. Solr索引后是否存储文档的原始内容?
- 11. solr/lucene中索引大型文档的可能问题
- 12. 是否可以通过URI引用存储在独立存储中的文件?
- 13. Lucene的索引内存中的索引是什么样的?
- 14. 如何遍历boost :: serialization中的存档
- 15. 检查索引中是否存在文档的条件(Lucene.NET)
- 16. 递减索引Lucene文档的内存使用率
- 17. 您是否可以从Solr索引中的文档中删除字段?
- 18. 是否可以从下往上遍历文件? [C]
- 19. 如何检索3.0.2中由Lucene索引的文档总数?
- 20. 在数据库或Lucene索引文件中存储字段
- 21. 是否可以遍历Oracle中的rowtype字段?
- 22. 不能遍历XML文档
- 23. Apache Solr - 文档本身是否存储在索引之外的内部?
- 24. 存储对父文档的引用,而不是存储文档的副本
- 25. 是否有可能在Lucene.net索引中取消删除文档?
- 26. 如何遍历HTML文档中的XML?
- 27. 自动遍历MongoDB中的文档
- 28. java中的XML文档遍历
- 29. 如何在lucene中搜索索引文档时获取唯一文档
- 30. Azure搜索不再在blob存储中索引文档
是什么发生,如果(reader.isDeleted(i))的缺失? – 2010-02-24 16:16:36
如果没有执行isDeleted()检查,您将输出以前删除的文档的ID – bajafresh4life 2010-02-25 03:34:51
要从上面完成评论。当索引重新打开时索引更改将被提交,因此reader.isDeleted(i)对于确保文档有效是必需的。 – 2011-02-24 11:29:05