tutorial support query not multi español does cutoff_frequency lucene elasticsearch

lucene - support - query dsl kibana



Búsqueda exacta en tipo de objeto de matriz usando elasticsearch (2)

Encontré una solución para nuestro caso de uso que parece funcionar. Se basa en dos filtros y el conocimiento de la cantidad de categorías con las que queremos comparar. Hacemos uso de un filtro de términos y un filtro de scripts para verificar el tamaño de la matriz. En este ejemplo, marketBasketList es similar a su entrada de categorías.

{ "query": { "bool": { "must": [ { "match": { "siteId": 4 } }, { "match": { "marketBasketList": { "query": [ 10, 11 ], "operator": "and" } } } ] }, "boost": 1, "filter": { "and": { "filters": [ { "script": { "script": "doc[''marketBasketList''].values.length == 2" } }, { "terms": { "marketBasketList": [ 10, 11 ], "execution": "and" } } ] } } } }

Estoy buscando una forma de hacer coincidencias de matriz exactas en la búsqueda elástica. Digamos que estos son mis documentos:

{"id": 1, "categories" : ["c", "d"]} {"id": 2, "categories" : ["b", "c", "d"]} {"id": 3, "categories" : ["c", "d", "e"]} {"id": 4, "categories" : ["d"]} {"id": 5, "categories" : ["c", "d"]}

¿Hay alguna manera de buscar todos los documentos que tienen exactamente las categorías "c" y "d" (documentos 1 y 5), ni más ni menos?

Como beneficio adicional: la búsqueda de "una de estas" categorías también debería ser posible también (por ejemplo, podría buscar "c" y obtener 1, 2, 3 y 5)

¿Alguna forma inteligente de abordar este problema?


Si tiene un conjunto discreto y conocido de categorías, puede usar una consulta bool:

"bool" : { "must" : { "terms" : { "categories" : ["c", "d"], minimum_should_match : 2 } }, "must_not" : { "terms" : { "categories" : ["a", "b", "e"], minimum_should_match : 1 } } }

De lo contrario, probablemente la forma más fácil de lograr esto, creo, es almacenar otro campo que sirve como palabra clave de categorías.

{"id": 1, "categories" : ["c", "d"], "categorieskey" : "cd"}

Algo como eso. A continuación, puede consultar fácilmente con una consulta de términos para obtener los resultados que desea, como por ejemplo:

term { "categorieskey" : "cd" }

Y aún puede buscar de forma no exclusiva, como;

term { "categories" : "c" }

La consulta de dos categorías que deben estar presentes es bastante fácil, pero evitar que otras categorías potenciales estén presentes es un poco más difícil. Podrías hacerlo, probablemente. Probablemente desee escribir una consulta para buscar registros con ambos, luego aplique un filtro eliminando los registros con categorías distintas a las especificadas. No es realmente un tipo de búsqueda que Lucene está realmente diseñado para manejar, que yo sepa.

Honestamente estoy teniendo problemas para encontrar un buen filtro para usar aquí. Es posible que necesite un filtro de scripts o puede filtrar los resultados una vez recuperados.