Самый быстрый способ подсчитать все результаты в Lucene (Java) - PullRequest
9 голосов
/ 07 февраля 2011

Какой самый быстрый способ подсчитать все результаты для данного запроса в Lucene?

  1. TopDocs.totalHits
  2. реализовать и управлять фильтром, используя QueryFilter
  3. реализовать пользовательский коллектор.Это просто увеличивает счет в методе collect (int doc) и возвращает true для метода acceptsDocOutOfOrder ().Все остальные методы - NOOPS.

Так как 1. будет делать оценку по всем документам, а 2. может иметь прямое попадание из-за загрузки FieldCache, я предполагаю, что ответ равен 3. Это просто кажетсяСтранно, что Lucene не предоставляет такого сборщика из коробки?

Ответы [ 2 ]

9 голосов
/ 07 февраля 2011
1 голос
/ 07 февраля 2011

Вы правы, что №3 будет быстрее, но я не думаю, что это из-за выигрыша.Существует гораздо более быстрый способ, перейдите к основанию, если вас не интересуют причины этого.

Потеря производительности # 1 происходит из-за того, что сборщик TopDocs будет хранить документы в очереди с приоритетами, что означает, что вы потеряете некоторое время, сортируя их по счету.(Вы также израсходуете немного памяти, но, поскольку вы храните только кучу пар int + float, это, вероятно, довольно минимально.)

Почему Lucene не предоставляет это из коробки:Вы обычно не хотите, чтобы найти все результаты.Вот почему при поиске вы говорите, что найдете только самые лучшие n результаты.Для этого есть веских теоретических оснований .Даже Google говорит: «Показано 25 из о n результатов».

Так что мой совет вам следующий: если у вас есть разумное количество результатов, то использование TopDocs.totalHits не будетбыть слишком плохим с точки зрения производительности.Если метод totalHits доставляет вам проблемы, я не думаю, что пользовательский сборщик будет намного лучше.(TopDocs.totalHits будет запущен через n log n раз, а пользовательский сборщик будет линейным. В зависимости от вашей настройки коэффициент log n может быть релевантным или нет.)

Итак, если выэта функциональность абсолютно необходима, а TopDocs.totalHits слишком медленный, я бы порекомендовал посмотреть на частоту поисковых запросов в документе.Вы можете предположить, что частота независима (поэтому p (A и B) = p (A) * p (B)) и сделать довольно хорошее предположение отсюда.Это будет очень быстро, потому что это просто поиск в постоянном времени для каждого термина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...