我有一个相当大的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 - &gt;元数据映射。) 谢谢!
更新:我现在正试图像这样使用FieldCache:
String metadatas[] = org.apache.lucene.search.FieldCache.DEFAULT.getStrings(searcher.getIndexReader(), "metaData");
当我打开索引并查询时:
int ldocId = hits[i].doc;
String metadata = metadatas[ldocId];
这对我来说效果很好。
答案 0 :(得分:1)
您最好选择提高性能,尽可能减少存储的数据。如果索引中存储了大量内容字段,则将其设置为仅编入索引,而不是存储将提高您的性能。在Lucene外部存储内容,在索引中找到匹配后获取内容通常是一个更好的主意。
还有可能存在更好的方法来获得您正在寻找的最终结果。我猜这5000套元数据不是最终的结果。您可以更轻松地对Lucene中的索引数据处理您的分析,而不是首先将其全部拉出索引。不知道,根据你提供的内容,这是否可能在你的情况下,但肯定值得一看。