我有一些文檔存儲在一個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. Lucene是否將實際文檔存儲在其索引中?
- 2. Lucene索引是否可以存儲在RDBMS中
- 3. 是否可以將文檔字段存儲在SearchKit索引中?
- 4. Lucene - 是否可以將文檔添加到索引的「開始」
- 5. lucene是否在搜索時遍歷整個倒排索引?
- 6. 是否有可能改變Lucene索引中的文檔排名?
- 7. 如何檢查文檔是否存在於lucene索引中?
- 8. Lucene的倒排索引是否存儲在內存中?
- 9. 是否有可能爲Lucene來索引只存儲在一個文件中
- 10. SOLR模式 - 存儲文檔Id字段。在Lucene索引文件
- 11. 是否可以在Apache Lucene中存儲文件?
- 12. Lucene能夠在索引中存儲100GB以上的原始文檔嗎?
- 13. 如何讀取不存儲在Lucene的文檔,但索引
- 14. Lucene索引html文檔
- 15. Lucene更新文檔索引
- 16. 是否可以使用其文檔ID更新Lucene文檔?
- 17. Lucene自定義評分(Lucene 3.2)涉及遍歷索引中的所有文檔 - 最快的方式?
- 18. 是否可以通過索引遍歷FileSystemObject子文件夾集合?
- 19. 是否可以遍歷JSON來查找屬性是否存在?
- 20. solr和lucene中的索引存儲
- 21. 是否可以遍歷存儲在元組中的函數列表?
- 22. Solr索引後是否存儲文檔的原始內容?
- 23. Lucene索引可以包含不同類型的文檔
- 24. 歸檔lucene索引
- 25. 是否可以通過匹配的術語訂購lucene文檔?
- 26. 遍歷XML文檔
- 27. solr/lucene中索引大型文檔的可能問題
- 28. 是否可以通過URI引用存儲在獨立存儲中的文件?
- 29. 如何重新創建索引遍歷存儲在文件中的樹
- 30. 在neo4j中結合lucene索引和遍歷以給出單個結果集
是什麼發生,如果(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