2012-07-25 10 views
29

Soy bastante nuevo en elasticsearch y solo necesito algunas aclaraciones: ¿Podemos definir un analizador mientras consultamos el servidor de búsqueda? Lo he probado con el "texto" y consulta "campo" y funciona bien:Definición de analizador al realizar consultas en elásticoBuscar

Consulta:

curl -XPOST http://localhost:9200/test/user/_search? -d '{ "query" : { 
"text" : {"_all" : {"query" :"Vaibhav","analyzer" : 
"lowercase_keyword" }} } }' 

Resultado:

{"took":144,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.10848885,"hits":{"_index":"test","_type":"user","_id":"1","_score":0.10848885, 
"_source" : { 
    "first_name": "Vaibhav", 
    "last_name":"saini", 
    "password":"pwd" 

Pero cuando trato de hacer lo mismo con plazo/prefijo/consulta comodín consigo la excepción:

consulta:

curl -XPOST http://localhost:9200/test/user/_search? -d '{ 
"query" : { "term" : {"_all" : {"query" :"Vaibhav","analyzer" : 
"lowercase_keyword" }} } }' 

Resultado:

{"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures 
{[kws9J6tbQtWCMNKBm3Gpkw][test][4]: SearchParseException[[test][4]: 
from[-1],size[-1]: Parse Failure [Failed to parse source 
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\" 
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested: 
QueryParsingException[[test] [term] query does not support [query]]; 
}{[kws9J6tbQtWCMNKBm3Gpkw][test][1]: SearchParseException[[test][1]: 
from[-1],size[-1]: Parse Failure [Failed to parse source 
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\" 
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested: 
QueryParsingException[[test] [term] query does not support [query]]; 
}{[kws9J6tbQtWCMNKBm3Gpkw][test][2]: SearchParseException[[test][2]: 
from[-1],size[-1]: Parse Failure [Failed to parse source 
[\n{\n\"query\" : {\n\"term\" : {\"_all\" : {\"query\" 
:\"Vaibhav\",\"analyzer\" : \"lowercase_keyword\" }}\n}\n}]]]; nested: 
QueryParsingException[[test] [term] query does not support [query]]; 
}]","status":500} 

Entonces, ¿es que no podemos definir analayzers al consultar el servidor elasticsearch por algún tipo de consultas y para los demás podemos? Si no, ¿estoy haciendo algo mal?

Cualquier ayuda es muy apreciada.

Respuesta

21

Las consultas term, prefix y wildcard esperan que el valor especificado en la consulta ya se haya analizado.

+2

El documento elasticsearch dice que la consulta de términos coincide con documentos que tienen campos que contienen un término (no analizado). http://www.elasticsearch.org/guide/reference/query-dsl/term-query.html – vaibhav

+0

Gracias Imotov. Pero tengo una duda aquí, si este es el caso, entonces en el ejemplo anterior, mientras consulto, debería obtener el resultado independientemente de qué carcasa estoy usando. Por ejemplo, en mi índice de datos en el campo "primer nombre" es "Vaibhav", también el analizador utilizado para este campo es un analizador personalizado que utiliza tokenizer como "Palabra clave" y filtro como "minúscula", por lo que mis datos se indexan como "vaibhav" en lugar de "Vaibhav", que es como se esperaba. –

+1

Ahora cuando lo consulto utilizando una consulta de término/prefijo/comodín en "vaibhav" obtengo el resultado, pero cuando lo consulto en "Vaibhav" no obtengo el resultado (tal vez porque está indexado como "vaibhav") . Entonces, mi requisito aquí es que mi consulta sea insensible a mayúsculas y minúsculas. gracias –

4

Esta sintaxis trabajó para mí:

GET /_search 
{ 
    "query": { 
    "match_phrase": { 
     "controller": { 
     "analyzer": "keyword", 
     "query": "api/v2/test" 
     } 
    } 
    } 
} 

encontrar más detalles en la documentation.

+0

aunque este JSON no funciona para mí, pero el analizador requerido es la respuesta. – Sinux

0

Puede establecer un search-analyzer personalizado para usar en las consultas.

A partir de los documentos:

Por lo general, el mismo analizador se debe aplicar a la hora de índice y en tiempo de búsqueda, para asegurar que los términos de la consulta están en el mismo formato que los términos de la índice invertido.

A veces, sin embargo, puede tener sentido utilizar un analizador diferente en el momento de la búsqueda , como cuando se utiliza el análisis-edgengram-tokenizer para autocompletar.

De manera predeterminada, las consultas se utilice el analyzer se define en la asignación de campos, pero Esto se puede anular con el establecimiento de search_analyzer

Los documentos también enumeran un ejemplo. https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html

Cuestiones relacionadas