【问题标题】:Efficiently returning a field of all query hits in Lucene在 Lucene 中有效地返回所有查询命中的字段
【发布时间】: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 中不再可用,您知道其他类似的方法吗?

标签: search lucene indexing


【解决方案1】:

提高性能最好的办法是尽可能减少存储的数据。如果您在索引中存储了一个大的内容字段,将其设置为仅索引而不是存储将提高您的性能。将内容存储在 Lucene 外部,以便在索引中找到命中后获取,这通常是一个更好的主意。

还有可能存在更好的方法来获得您正在寻找的最终结果。我猜这 5000 组元数据并不是这里的最终结果。 Lucene 中的索引数据可以更轻松地处理您的分析,而不是先将其全部从索引中提取出来。不知道,根据您提供的内容,您的情况是否可行,但肯定值得一看。

【讨论】:

  • 字符串元数据[] = org.apache.lucene.search.FieldCache.DEFAULT.getStrings(searcher.getIndexReader(), "metaData");
  • 不太清楚你在这里想说什么。是否要获取元数据字段中的所有值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2020-10-01
  • 2020-08-05
  • 1970-01-01
  • 2011-12-30
相关资源
最近更新 更多