2013-05-21 79 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