2013-05-21 80 views
2

我有一個相當大的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]; 

這是爲我工作很好。

+0

嗨,我有類似的問題,但是fieldcache.default.getStrings不能在lucene4.5.1中使用,你知道任何其他類似的方法嗎? – ikel

回答

1

你最好改善性能,就是儘可能減少存儲的數據。如果您在索引中存儲了大量內容字段,將其設置爲僅索引,而不是存儲會提高您的性能。在索引中找到命中之後存儲Lucene外部的內容通常是一個更好的主意。

還有可能存在一種更好的方式來達到您要查找的最終結果。我猜測這5000套元數據並不是最終結果。您可以更輕鬆地使用Lucene中的索引數據處理您的分析,而不是先將索引全部從索引中提取出來。根據你提供的內容,不知道你的情況是否可行,但肯定值得一看。

+0

String metadata [] = org.apache.lucene.search.FieldCache.DEFAULT.getStrings(searcher.getIndexReader(),「metaData」); – user1001630

+0

不太確定你想在這裏說什麼。你想獲取元數據字段中的所有值嗎? – femtoRgon