我有一個相當大的lucene索引,並且查詢可以打擊大約5000個左右的文檔。我將應用程序元數據存儲在lucene的一個字段中(除文本內容外),並且需要快速訪問這個小型元數據字段以獲得所有5000個點擊量。目前,我的代碼看起來是這樣的:有效返回Lucene中所有查詢匹配的字段
MapFieldSelector field = new MapFieldSelector("metaData");
ScoreDoc[] hits = searcher.search(query, null, 10000).scoreDocs;
for (int i = 0; i < hits.length; i++) {
int index_doc_id = hits[i].doc;
Document hitDoc = searcher.doc(index_doc_id, field); // expensive esp with disk-based lucene index
metadata = hitDoc.getFieldable("metaData").stringValue();
}
然而,這是非常緩慢的,因爲每次調用searcher.doc()是相當昂貴的。有沒有辦法對所有可能更具響應性的匹配進行「批量」提取字段? 或以其他方式使這項工作更快? (ScoreDoc裏面唯一的東西看起來就是Lucene doc id,我不明白這是我的理解,否則我會自己維護一個Lucene doc id - > metadata map。) 謝謝!
更新:我現在試圖用FieldCache是這樣的:
String metadatas[] = org.apache.lucene.search.FieldCache.DEFAULT.getStrings(searcher.getIndexReader(), "metaData");
當我打開索引,並在查詢:
int ldocId = hits[i].doc;
String metadata = metadatas[ldocId];
這是爲我工作很好。
嗨,我有類似的問題,但是fieldcache.default.getStrings不能在lucene4.5.1中使用,你知道任何其他類似的方法嗎? – ikel