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