2012-03-26 21 views
5

Tenemos una instancia de solr con 86,315,770 documentos. Está usando hasta 4GB de memoria y lo necesitamos para facetar en un campo tokenizado llamado contenido. El tamaño del índice en el disco es de 23 GB.Solr faceted search performance recommendations

¿Por qué nos estamos enfrentando en un campo tokenizado? Porque queremos consultar los principales términos "n" más usados ​​en ese campo. El problema es que lleva demasiado tiempo realizar tales consultas. ¿Hay alguna forma de mejorar los tiempos al hacer facetas como esta? ¿Alguna recomendación?

Gracias de antemano.

+0

¿Está configurando 'facet.limit'? Me he dado cuenta de que estas consultas pueden llevar mucho tiempo incluso con más de 100.000 registros si 'facet.limit' no está configurado (en su caso, lo que' n' podría ser). –

Respuesta

2

Dado que Solr calcula las facetas de las estructuras de datos en memoria, es probable que el cálculo de facetas esté vinculado a la CPU. El código para calcular facetas ya está altamente optimizado (el método getCounts en UnInvertedField para un campo multivaluado).

Una idea sería paralelizar el cálculo. Tal vez la forma más fácil de hacer esto sea dividir su colección en varios fragmentos como se describe en Do multiple Solr shards on a single machine improve performance?.

De lo contrario, si su diccionario de términos es lo suficientemente pequeño y las consultas pueden tomar un número limitado de formularios, puede configurar un sistema diferente que mantenga la matriz de conteos para cada par (término, consulta). Por ejemplo, si solo permite consultas de términos, esto significa que debe mantener los recuentos para cada par de términos. Tenga en cuenta que esto requeriría mucho espacio en disco dependiendo de la cantidad total de términos y consultas. Si no requiere que los recuentos sean exactos, tal vez lo más fácil sea calcular estos recuentos en un proceso por lotes. De lo contrario, podría ser (posible, pero) un poco complicado mantener los conteos sincronizados con Solr.

0

Puede utilizar la función topTerms de LukeRequestHandler.

+0

El problema es que necesito aplicar el término recuento a una consulta. ¿Es posible con topTerms? – rreyes1979

+0

Debería establecer el parámetro 'numTerms' de la solicitud de Luke a cualquier número que desee, similar al uso de' facet.limit' como expliqué en mi comentario anterior. Sin embargo, Luke devolverá diferentes #s para los términos en su índice que la faceta simple vainilla, ya que Luke devuelve topTerms para documentos en su índice que ya no se pueden buscar (es decir, aquellos que se han eliminado pero aún no se han fusionado). –

+0

Además, probé la velocidad de Luke contra la facetación e invariablemente lleva más tiempo. Dicho esto, si está utilizando Solr 3.6 o 4.0, se supone que hubo algunas mejoras de velocidad en el LukeRequestHandler en esas versiones. –