【发布时间】:2013-05-16 18:37:09
【问题描述】:
我有一个相当大的 lucene 索引,并且查询可以访问大约 5000 个文档左右。我将我的应用程序元数据存储在 lucene 的一个字段中(除了文本内容),并且需要快速访问这个小的元数据字段以获取所有 5000 次点击。目前,我的代码如下所示:
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 -> 元数据映射。) 谢谢!
更新:我现在正在尝试像这样使用 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 中不再可用,您知道其他类似的方法吗?