Как получить общее количество потенциальных результатов в Lucene

Я использую lucene на моем сайте, и я хочу показать общий результат из запроса, например:

Отображение результатов x на y из z

Но я не могу найти какой-либо метод, который вернет мне общее количество потенциальных результатов. Я могу только найти методы, которые вы должны указать количество результатов, которые вы хотите, и поскольку я хочу только 10 на страницу, кажется логичным передать в 10 количество результатов.

Или я делаю это неправильно, должен ли я говорить 1000, а затем просто принимать 10 в диапазоне, который мне нужен?

Ответы

Ответ 1

Кстати, поскольку я лично знаю, что должен указать другим, я уже знал, что вы ссылаетесь на Lucene.net, а не на Lucene:), хотя API будет тем же самым

В версиях до 2.9.x вы можете вызвать IndexSearcher.Search(Query query, Filter filter), который возвратил объект Hits, одним из свойств [методов, технически, из-за порта Java] был Length()

Теперь это обозначено как "Устаревшее", так как оно будет удалено в 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, требующим от вас написать свой собственный коллектор, принцип разъясняется, говоря разработчику, чтобы избежать десериализации каждого результата из индекса поскольку по умолчанию предоставляются только совпадающие идентификаторы документов и оценка.

Ответ 2

Главный сборщик документов делает это для вас, например

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

Вышеуказанный запрос будет считать все обращения, но возвращает только 10.