2010-05-11 25 views
48

me gustaría hacer el equivalente de este SQL pero con Solr como mi almacén de datos.¿Cómo seleccionar valores de campo distintos con Solr?

SELECT 
    DISTINCT txt 
FROM 
    my_table; 

¿Qué sintaxis obligaría a Solr a solo darme valores distintos?

http://localhost:8983/solr/select?q=txt:?????&fl=txt 

EDIT: búsqueda facetada Así parece encajar, pero a medida que investigué, me di cuenta que tenía sólo la mitad detallada del problema.

Mi consulta SQL debería haber leído ...

SELECT 
    DISTINCT SUBSTR(txt,0,3) 
FROM 
    my_table; 

cualquier posibilidad de esto con Solr?

Respuesta

2

echar un vistazo a búsqueda por facetas

66

Faceting le conseguiría un conjunto que contiene los resultados de distintos valores para un campo.

E.g.

http://localhost:8983/solr/select/?q=*%3A*&rows=0&facet=on&facet.field=txt 

Debe obtener algo a cambio como éste:

<response> 
<responseHeader><status>0</status><QTime>2</QTime></responseHeader> 
<result numFound="4" start="0"/> 
<lst name="facet_counts"> 
<lst name="facet_queries"/> 
<lst name="facet_fields"> 
    <lst name="txt"> 
     <int name="value">100</int> 
     <int name="value1">80</int> 
     <int name="value2">5</int> 
     <int name="value3">2</int> 
     <int name="value4">1</int> 
    </lst> 
</lst> 
</lst> 
</response> 

Mira la wiki para más información. La facetación es una parte muy buena de solr. Disfrutar :)

http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields

Nota: El facetado mostrará el valor indexado, es decir, después de todos los filtros han sido aplicados. Una forma de evitar esto es usar el método copyfield, para que pueda crear una versión de faceta del campo txt. De esta forma tus resultados mostrarán el valor original.

Espero que ayude .. Un montón de documentación sobre tallar disponible en el wiki. O yo he escrito algunas de ellas con capturas de pantalla .. que se puede ver aquí:

http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html

+0

Llegué a esta respuesta buscando en Google para solr distinct. Sin embargo, necesita campos múltiples. Algo como país distinto, usuario. – HMR

+0

Resolvió el campo múltiple al indexar un campo múltiple (campo1 + "." + Campo2). Ahora necesito saber cuántos fields1, field2 distintos hay. Hay más de 2 millones de campos1.campo2. Lo siguiente me dio una pista: http: //yonik.com/solr-count-distinct/ no estoy seguro de cómo hacer esto sin json pero se vería algo así como: 'q = tipo: 1 & start = 0 & rows = 0 & json.facet = { uniquecount: "unique (field1field2_s)"} ' – HMR

4

que almacenaría la subcadena en un campo diferente (Llamemos en txt_substring), a continuación, faceta en txt_substring como mostró CraftyFella.

Normalmente me gustaría usar el n-gram tokenizer, pero no creo que pueda faceta en eso.

19

Para la parte DISTINCT de su pregunta, creo que es posible que esté buscando field collapsing/grouping functions de Solr. Le permitirá especificar un campo del que desea resultados únicos, crear un grupo en esos valores únicos y le mostrará cuántos documentos pertenecen a ese grupo.

A continuación, puede utilizar el mismo substr almacenada en un campo separado, y el colapso en eso.

+0

exactamente lo que necesitaba. y exactamente lo que necesitaba – encodes

+1

yo también! gracias hombre – Oussama

+0

Según el tipo de campo, es posible que pueda utilizar comodines (anclados a la izquierda). Pero como suele ser el caso, la mejor solución con cualquier tecnología de índice es anticipar la pregunta. I.E., si sabe que rutinariamente va a buscar SUBSTR (txt, 0,3), entonces crea un campo en el índice poblado por esa subcadena. Si, en cambio, el "txt" y la longitud de la subcadena son variables, entonces n-grama u otro procesamiento es la mejor ruta. –

3

Uso del StatsComponent con el parámetro stats.calcdistinct para obtener una lista de valores diferentes para un determinado campo:

https://cwiki.apache.org/confluence/display/solr/The+Stats+Component

También le dará el recuento de valores distintos.(En el caso de las facetas, necesita saber el recuento para solicitarlo todo o establecer el límite de faceta en algo realmente alto y contar el resultado usted mismo. Además, necesita un campo de cadena para que las facetas funcionen de la manera que lo necesita aquí.)

http://wiki.apache.org/solr/StatsComponent está pasada de moda, ya que no cubre stats.calcdistinct

stats.calcdistinct es, probablemente, disponible desde 4,7.

Ejemplo:

/select?stats=on&stats.field=region&rows=0&stats.calcdistinct=true 

"stats":{ 
    "stats_fields":{ 
    "region":{ 
     "min":"GB", 
     "max":"GB", 
     "count":20276, 
     "missing":0, 
     "distinctValues":["GB"], 
     "countDistinct":1}}}} 
1

Solr 5.1 y más tarde tiene el nuevo módulo de la faceta que ha integrado la ayuda para encontrar el número de valores únicos en un campo. Incluso puede encontrar el número de valores únicos en un campo para cada segmento de una faceta, y ordenar por ese valor para encontrar el número más alto o más bajo de valores únicos.

número de valores únicos en "myfield": json.facet = {x: 'único (myfield)'}

faceta por el campo "categoría", y para cada categoría, muestra el número de valores únicos en "color":

json.facet={ 
    cat_breakdown : { terms : { // group results by unique values of "category" 
    field : category, 
    facet : { 
     x : "unique(color)", // for each category, find the number of unique colors 
     y : "avg(price)"  // for each category, find the average price 
    } 
    }} 
} 

Esto está en Solr 5.1 y posterior. Más funciones de faceta como "único" se muestran en http://yonik.com/solr-facet-functions/

Cuestiones relacionadas