我有一个相当大的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