Я использую lucene на моем сайте, и я хочу показать общее количество результата от запроса, например:
Показ результатов x к y z
Но я не могу найти метод, который возвратит меня общее количество потенциальных результатов. Я, может только казаться, нахожу методы, которые необходимо указать количество результатов, которые Вы хотите, и так как я только хочу 10 на страницу, которую кажется логичным передать в 10 как количество результатов.
Или я делаю эту несправедливость, я должен быть передающим в, говорят 1000 и затем просто взятие 10 в диапазоне, что я требую?
Кстати, поскольку я знаю вас лично, я должен указать другим, я уже знал, что вы имеете в виду Lucene.net, а не Lucene :) хотя API будет таким же
В в версиях до 2.9.x можно было вызвать IndexSearcher.Search (запрос запроса, фильтр фильтра)
, который вернул объект Hits
, одно из свойств [методов, технически из-за Java порт] был Длина ()
Теперь это отметка ed Устарело, поскольку оно будет удалено в версии 3.0, единственные результаты поиска возвращают объекты TopDocs
или TopFieldDocs
.
Ваши альтернативы:
a) Используйте IndexServer.Search (запрос запроса, число целых чисел)
, который вернет объект TopDocs
, поэтому TopDocs.TotalHits
покажет вам общее количество возможных совпадений, но за счет фактического создания
результатов
б) Более быстрый способ - реализовать собственный объект Collector
( наследуется от Lucene.Net.Search.Collector
) и вызывает IndexSearcher.Search (запрос запроса, сборщик коллектора)
. Метод поиска будет вызывать Collect (int docId)
в вашем сборщике при каждом совпадении, поэтому, если вы внутренне отслеживаете это, у вас есть способ собрать все результаты.
Следует отметить, что Lucene не является средой запросов с полным набором результатов и предназначена для максимально быстрой потоковой передачи наиболее релевантных результатов вам (разработчику). Любой метод, который дает вам «общее количество результатов», является просто оболочкой, перечисляющей все совпадения (как и в случае с методом Collector).
Уловка состоит в том, чтобы сделать это перечисление как можно быстрее. Самая дорогая часть - десериализация документов из индекса, заполнение каждого поля и т. Д. По крайней мере, с новым дизайном API, требующим написания собственного сборщика, принцип проясняется, говоря разработчику избегать десериализации каждого результата из индекса. поскольку по умолчанию предоставляются только совпадающие идентификаторы документов и оценка.
Верхний сборщик документов сделает это за вас, например
TopDocs topDocs = searcher.search(qry, 10);
int totalHits = topDocs.totalHits ;
Вышеупомянутый запрос подсчитает все совпадения, но вернет только 10.
{{ 1}}