2010-06-03 19 views
7

Tenemos un requisito en el que necesitamos para agrupar nuestros registros por un campo particular y tomamos la suma de un campo numérico correspondienteApache Solr: suma de los datos de resultado de grupo por

e.x. seleccione userid, sum (click_count) del grupo user_action por ID de usuario;

que estamos tratando de hacer esto utilizando Apache Solr y encontró que había 2 maneras de hacer esto:

  1. utilizando el campo de función (http://blog.jteam.nl/2009/10/20/result-grouping-field-collapsing-with-solr/) colapso, pero encontraron 2 problemas con este : 1.1. Esto no forma parte de la versión y está disponible como parche, por lo que no estamos seguros de si podemos utilizarlo en la producción. 1.2. No recuperamos la suma sino los recuentos individuales y debemos sumarla en el lado del cliente.

  2. Usando el componente Stats junto con la búsqueda facetada (http://wiki.apache.org/solr/StatsComponent). Esto cumple con nuestros requisitos, pero no es lo suficientemente rápido para conjuntos de datos muy grandes.

Solo quería saber si alguien sabe de alguna otra manera de lograrlo. Apreciar cualquier ayuda.

Gracias,

Terance.

+0

¿Qué tan grande es el conjunto de datos? ¿haces shard el índice? –

+0

Creo que deberías tratar de comparar la segunda vía. Las facetas son bastante rápidas a partir de Solr 1.4. –

Respuesta

5

¿Por qué, en cambio, no utiliza el StatsComponent? - Disponible desde Solr 1.4 en adelante.

$ curl 'http://search/select?q=*&rows=0&stats=on&stats.field=click_count' | 
    tidy -xml -indent -quiet -wrap 2000000 

<?xml version="1.0" encoding="utf-8"?> 
<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">17</int> 
    <lst name="params"> 
     <str name="q">*</str> 
     <str name="stats">on</str> 
     <arr name="stats.field"> 
     <str>click_count</str> 
     </arr> 
     <str name="rows">0</str> 
    </lst> 
    </lst> 
    <result name="response" numFound="577" start="0" /> 
    <lst name="stats"> 
    <lst name="stats_fields"> 
     <lst name="click_count"> 
     <double name="min">1.0</double> 
     <double name="max">3487.0</double> 
     <double name="sum">47912.0</double> 
     <long name="count">577</long> 
     <long name="missing">0</long> 
     <double name="sumOfSquares">4.0208702E7</double> 
     <double name="mean">83.0363951473137</double> 
     <double name="stddev">250.79824725438448</double> 
     </lst> 
    </lst> 
    </lst> 
</response>