2010-04-06 51 views
14

我使用我的网站Lucene和我想要显示从查询总结果数,例如:如何获得的潜在结果总数Lucene的

显示结果XŸž

但我无法找到这将返回我的潜在结果总数的任何方法。我似乎只能找到方法,你必须指定你想要的结果数量,而且由于我只需要每页10个,所以在结果数量中传递10就显得合乎逻辑了。

或者我做错了,我应该通过说1000,然后只是在我需要的范围内10?

回答

15

顺便说一句,因为我知道你个人而言,我应该点为其他人我已经知道你指的是Lucene.net,而不是Lucene :)虽然API将是相同的

在2.9.x之前的版本,你可以调用IndexSearcher.Search(Query query, Filter filter)返回d一个Hits对象,其中的一个性质[方法,在技术上,由于渣口]是Length()

这现在被标记作废,因为它会在3.0中被移除,的搜索返回TopDocsTopFieldDocs对象的唯一结果。

你的选择是

一)使用IndexServer.Search(Query query, int count)它会返回一个TopDocs对象,所以TopDocs.TotalHits会告诉你总能命中,但在实际创建<count>结果

B)为代价的快速方法是实现您自己的Collector对象(继承自Lucene.Net.Search.Collector)并致电IndexSearcher.Search(Query query, Collector collector)。在每场比赛中,搜索方法都会在您的收藏夹上调用Collect(int docId),因此如果您在内部追踪您获得所有结果的方式。

应该注意的是,Lucene不是一个总体结果集查询环境,它旨在尽可能快地向您(开发人员)发送最相关的结果。任何给你一个“总计结果”计数的方法只是一个枚举所有匹配的包装器(与收集器方法一样)。

诀窍是尽可能快地保持这个枚举。最昂贵的部分是索引中的文档反序列化,填充每个字段等等。至少在更新的API设计中,要求您编写自己的收集器时,通过告诉开发人员避免对索引中的每个结果进行反序列化因为默认情况下只提供匹配的文档ID和分数。

+0

-1对于不完整的答案(我非常感谢你帮助别人),但是'IndexServer'在哪里? – Dementic 2014-06-23 17:42:13

+0

@Dementic'IndexServer'的引用是一个错字,它应该在所有情况下都是'IndexSearcher'。 – 2015-07-13 07:31:01

9

顶部的文档收集器可以实现这个要求,例如

TopDocs topDocs = searcher.search(qry, 10); 
int totalHits = topDocs.totalHits ; 

上面的查询会计算所有命中,但回到只有10