2011-02-07 11 views
9

¿Cuál es la forma más rápida de contar todos los resultados para una consulta determinada en Lucene?La forma más rápida de contar todos los resultados en Lucene (java)

  1. TopDocs.totalHits
  2. implantar y gestionar un filtro, utilizando QueryFilter
  3. implementar una costumbre 'contar' Collector. Esto simplemente incrementa un conteo en el método collect (int doc) y devuelve true para el método acceptsDocOutOfOrder(). Todos los demás métodos son NOOPS.

Dado que 1. hará una puntuación en todos los documentos, y 2. podría tener un impacto inicial debido a la carga de la Caché de campo, supongo que la respuesta es 3. Parece extraño que Lucene no proporcione una tal coleccionista fuera de la caja?

Respuesta

1

Tiene usted razón de que el n. ° 3 será más rápido, pero no creo que sea por la puntuación. Hay una manera mucho más rápida, salta al final si no te importa el razonamiento detrás de esto.

La pérdida de rendimiento de # 1 proviene del hecho de que el recopilador de TopDocs mantendrá los documentos en una cola de prioridad, lo que significa que perderá algo de tiempo clasificándolos por puntaje. (También consumirá algo de memoria, pero como está almacenando solo un montón de pares int + float, probablemente sea bastante mínimo.)

¿Por qué Lucene no proporciona esto de la caja ?: en general no quiero encontrar todos los resultados Es por eso que cuando buscas, dices que solo encuentras los primeros n resultados. Hay strong theoretical reasons para esto. Incluso Google dice "Mostrando 25 de sobre n results."

Así que mi consejo para usted es el siguiente: si tiene una cantidad razonable de resultados, entonces usar TopDocs.totalHits no será tan malo para el rendimiento. Si el método totalHits le da problemas, no creo que un recopilador personalizado sea mucho mejor. (TopDocs.totalHits se ejecutará en n log n time, y el recopilador personalizado será lineal. Dependiendo de su configuración, el coeficiente log n puede ser relevante, o no).

Por lo tanto, si necesita absolutamente esta funcionalidad, y TopDocs.totalHits es demasiado lenta, recomendaría mirar la frecuencia del documento de los términos de búsqueda. Podría suponer que la frecuencia es independiente (entonces p (A y B) = p (A) * p (B)) y hacer una buena suposición a partir de ahí. Será muy rápido, porque es solo una búsqueda de tiempo constante para cada término.

+0

Gracias por la respuesta. Iremos con un TotalHitCountCollector en esta etapa. Nuestro conjunto de datos aún es lo suficientemente pequeño para contar con precisión. Sin embargo, mantendré en mente el enfoque de la frecuencia de términos que describes; de hecho, parece el enfoque más rápido. – npellow

+0

Me pregunto cómo Google está haciendo esto. Claramente, en realidad no está devolviendo los resultados "top 25". Si lo fuera, entonces debería saber el número total de resultados como un efecto secundario de verificar todos los demás resultados para descubrir que no estaban entre los primeros 25. Mi teoría sería que está volviendo 25 esencialmente arbitraria "digna de ser los primeros "resultados". – Trejkaz

Cuestiones relacionadas