seleccionado - validar select html5
¿Cómo seleccionar valores de campo distintos usando Solr? (6)
Me gustaría hacer el equivalente de este SQL pero con Solr como mi almacén de datos.
SELECT
DISTINCT txt
FROM
my_table;
¿Qué sintaxis obligaría a Solr a darme solo valores distintos?
http://localhost:8983/solr/select?q=txt:?????&fl=txt
EDITAR: Parece que la búsqueda facetada encaja, pero mientras lo investigaba, me di cuenta de que solo había explicado la mitad del problema.
Mi consulta SQL debería haber leído ...
SELECT
DISTINCT SUBSTR(txt,0,3)
FROM
my_table;
¿Alguna posibilidad de esto con Solr?
La facetación le proporcionará un conjunto de resultados que contiene valores distintos para un campo.
P.ej
http://localhost:8983/solr/select/?q=*%3A*&rows=0&facet=on&facet.field=txt
Deberías recuperar algo así:
<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. Disfruta :)
http://wiki.apache.org/solr/SimpleFacetParameters#Facet_Fields
Nota: Faceting mostrará el valor indexado, es decir, después de aplicar todos los filtros. 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 .. Mucha documentación sobre faceting disponible en la wiki. O escribí algunas con capturas de pantalla ... que puedes consultar aquí:
http://www.craftyfella.com/2010/01/faceting-and-multifaceting-syntax-in.html
Para la parte DISTINCT
de su pregunta, creo que puede estar buscando las funciones de Solr de colapso / agrupamiento de campo . 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.
Luego puede usar el mismo substr
almacenado en un campo separado y colapsar sobre eso.
Solr 5.1 y posterior tiene el nuevo Módulo Facet que tiene soporte integrado 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: ''unique (myfield)''}
Faceta por 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 más tarde. Se muestran más funciones de faceta como "único" en http://yonik.com/solr-facet-functions/
Use StatsComponent con el parámetro stats.calcdistinct
para obtener una lista de valores distintos para un campo determinado:
https://cwiki.apache.org/confluence/display/solr/The+Stats+Component
También le dará la cuenta 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á desactualizado, ya que no cubre stats.calcdistinct
stats.calcdistinct
probablemente esté 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}}}}
echa un vistazo a la búsqueda facetada
txt_substring
la subcadena en un campo diferente (llamemos en txt_substring
), luego faceta en txt_substring
como lo mostró CraftyFella.
Normalmente usaría el tokenizer n-gram , pero no creo que puedas hacer faceta de eso.