operator - elasticsearch query not match
ElasticSearch: operador equivalente IN en ElasticSearch (2)
Estoy intentando encontrar una consulta de ElasticSearch equivalente a IN
/ NOT
en SQL.
Sé que podemos usar la consulta QueryString con múltiples OR para obtener la misma respuesta, pero eso termina con muchos OR''s.
¿Alguien puede compartir el ejemplo?
Similar a lo que Chris sugirió como comentario, el reemplazo análogo para IN
es el filtro de terms
(las consultas implican una puntuación, lo que puede mejorar el orden devuelto).
SELECT * FROM table WHERE id IN (1, 2, 3);
El filtro equivalente de Elasticsearch 1.x sería:
{
"query" : {
"filtered" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
El filtro equivalente Elasticsearch 2.x + sería:
{
"query" : {
"bool" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Lo importante es que los terms
filtro (y consulta para el caso) funcionan en concordancias exactas. Es implícitamente una or
operación, similar a IN
.
Si quisieras invertirlo, podrías usar el filtro no, pero yo sugeriría que must_not
filtro bool
/ must_not
poco más verboso (para hacerte el hábito de usar también bool
/ must
y bool
).
{
"query" : {
"bool" : {
"must_not" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
En general, la sintaxis de consulta del compuesto bool
es uno de los filtros más importantes en Elasticsearch , como lo son el term
(singular) y los filtros de terms
(en plural, como se muestra).
Vi lo que pediste. Y escribí el código fuente de la siguiente manera.
Espero que esto te ayude a resolver tu problema.
consulta sql:
select * from tablename where fieldname in (''AA'',''BB'');
búsqueda elástica:
{
query :{
bool:{
must:[{
"script": {
"script":{
"inline": "(doc[''fieldname''].value.toString().substring(0,2).toUpperCase() in [''AA'',''BB'']) == true"
}
}
}],
should:[],
must_not:[]
}
}
}