2010-04-06 20 views
14

estoy usando Lucene en un sitio de la mina y que quieren mostrar el recuento total resultado de una consulta, por ejemplo:Cómo obtener el número total de resultados posibles en Lucene

Mostrando resultados x a y de z

Pero no puedo encontrar ningún método que me va a devolver el número total de posibles resultados. Al parecer, solo puedo encontrar métodos para los que debe especificar el número de resultados que desea, y dado que solo deseo 10 por página, parece lógico pasar 10 como el número de resultados.

¿O estoy haciendo esto mal, debería pasar en digamos 1000 y luego tomar el 10 en el rango que requiero?

Respuesta

15

Por cierto, desde que te conozco personalmente debo señalar para otros, ya sabía que te referías a Lucene.net y no a Lucene :) aunque el API sería el mismo

En las versiones anteriores a la 2.9.x, puedes llamar al IndexSearcher.Search(Query query, Filter filter) que devuelve d un Hits objeto, una de las propiedades que [métodos, técnicamente, debido al puerto de Java] fue Length()

Este ahora está marcado obsoleto ya que se eliminará en 3,0, los únicos resultados de la búsqueda de retorno TopDocs o TopFieldDocs objetos.

Sus alternativas son

a) Uso IndexServer.Search(Query query, int count) que devolverá un objeto TopDocs, por lo TopDocs.TotalHits le mostrará los accesos totales posibles, pero a costa de crear realmente <count> resultados

b) Una forma más rápida es para implementar su propio objeto Collector (herede de Lucene.Net.Search.Collector) y llame al IndexSearcher.Search(Query query, Collector collector). El método de búsqueda llamará al Collect(int docId) en su colector en cada coincidencia, de modo que si internamente realiza un seguimiento de eso, tiene una manera de obtener todos los resultados.

Cabe señalar que Lucene no es un entorno de consulta de conjunto de resultados total y está diseñado para transmitirle los resultados más relevantes (el desarrollador) lo más rápido posible. Cualquier método que proporcione un recuento de "resultados totales" es solo un conteo que enumera todas las coincidencias (como con el método del recopilador).

El truco es mantener esta enumeración lo más rápido posible. La parte más costosa es la deserialización de documentos del índice, rellenando cada campo, etc. Al menos con el nuevo diseño de API, que requiere que escriba su propio recopilador, el principio se aclara al decirle al desarrollador que evite deserializar cada resultado del índice. ya que solo se asignan Id. de documentos coincidentes y una puntuación de forma predeterminada.

+0

-1 por respuesta incompleta (realmente aprecio que ayudes a alguien), pero ¿dónde está el 'IndexServer'? – Dementic

+0

@Dementic la referencia 'IndexServer' es un error tipográfico, debería ser' IndexSearcher' en todos los casos. –

9

El docs colector superior lo hace por usted, por ejemplo

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

La consulta anterior contará todos los golpes, pero devolver sólo 10.

Cuestiones relacionadas