如何获得Lucene的潜在结果总数

Aar*_*ell 16 lucene.net

我在我的网站上使用lucene,我想从查询中显示总结果数,例如:

显示结果xzz

但我找不到任何可以返回潜在结果总数的方法.我似乎只能找到你需要指定所需结果数量的方法,而且因为我只需要每页10个,所以将结果数传入10似乎是合乎逻辑的.

或者我做错了,我是否应该传递1000,然后在我要求的范围内取10?

Ale*_*ffe 15

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

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

现在这已标记为已过时,因为它将在3.0中删除,唯一的搜索返回结果TopDocsTopFieldDocs对象.

你的替代品是

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和分数.


Mik*_*kos 11

例如,顶级文档收集器会为您执行此操作

TopDocs topDocs = searcher.search(qry, 10); 
int totalHits = topDocs.totalHits ;
Run Code Online (Sandbox Code Playgroud)

以上查询将计算所有匹配,但仅返回10.