terms query operator not multiple fields bool array elasticsearch

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:[] } } }