我在我的网站上使用lucene,我想从查询中显示总结果数,例如:
将结果 x 显示为 z的 y
但我找不到任何可以返回潜在结果总数的方法。我似乎只能找到你需要指定所需结果数量的方法,而且因为我只需要每页10个,所以将10作为结果数传入是合乎逻辑的。
或者我做错了,我是否应该说1000,然后在我要求的范围内取10?
答案 0 :(得分:15)
BTW,因为我个人认识我应该指出其他人我已经知道你指的是Lucene.net而不是Lucene :)虽然API会是相同的
在2.9.x之前的版本中,您可以调用返回IndexSearcher.Search(Query query, Filter filter)
对象的Hits
,其中一个属性[方法,技术上,由于Java端口]为Length()
< / p>
现在标记为已废弃,因为它将在3.0中删除,搜索的唯一结果是返回TopDocs
或TopFieldDocs
个对象。
您的替代方案
a)使用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不是一个完整结果集查询环境,旨在尽可能快地向您(开发人员)传输最相关的结果。任何给出“总结果”计数的方法都只是枚举所有匹配的包装器(与Collector方法一样)。
诀窍是尽可能快地保持这个枚举。最昂贵的部分是索引中的文档的反序列化,填充每个字段等。至少在较新的API设计中,要求您编写自己的收集器,通过告诉开发人员避免从索引中反序列化每个结果来明确原则因为默认情况下只提供匹配的文档ID和分数。
答案 1 :(得分:11)
顶级文档收集器会为您执行此操作,例如
TopDocs topDocs = searcher.search(qry, 10);
int totalHits = topDocs.totalHits ;
以上查询将统计所有匹配,但仅返回10.