tutorial query aws elasticsearch lucene

query - elasticsearch tutorial



Consulta de campos cruzados de mĂșltiples coincidencias Elasticsearch con diferentes analizadores de consultas (2)

Debería poder implementar esto usando [query_string][1] . La cadena de consulta rompe los términos y luego los aplica en cada campo según el analizador. Ejemplo:

{ "query": { "query_string" : { "query" : "bangkok tailandia", "default_operator": "AND", "fields" : [ "city_txt_en", "country_txt_pt" ] } }, "profile": true }

CASO DE USO: Tengo una colección de companies . Cada compañía tiene información de city y country . Quiero poder hacer búsquedas de texto para encontrar, por ejemplo, empresas en Bangkok - Tailandia. Toda la información debe poder buscarse en diferentes idiomas. Ejemplo: en Brasil, la mayoría de las personas se refieren a Bangkok en la versión en inglés, y no a Banguecoque como a la brasileña. En este caso, si una persona quiere buscar compañías en Bangkok - Tailandia, la frase de búsqueda será bangkok tailandia . Debido a este requisito, debo ser capaz de buscar en diferentes campos de idiomas para recuperar los resultados.

PROBLEMA: Al enviar consultas sin especificar el analizador, Elasticsearch utiliza el analizador de búsqueda especificado en cada configuración de campo. El problema es que rompe el propósito de la consulta de campos cruzados. Esta es la configuración de los analizadores:

"query_analyzer_en": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding", "stopwords_en" ] }, "query_analyzer_pt": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding", "stopwords_pt" ] }

Cada analizador utiliza un filtro de stop diferente por idioma.

Esta es la configuración de los campos:

"dynamic_templates": [{ "english": { "match": "*_txt_en", "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "index_analyzer_en", "search_analyzer": "query_analyzer_en" } } }, { "portuguese": { "match": "*_txt_pt", "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "index_analyzer_pt", "search_analyzer": "query_analyzer_pt" } } }]

Esta es la consulta que estoy usando:

{ "query": { "multi_match" : { "query" : "bangkok tailandia", "type" : "cross_fields", "operator": "and", "fields" : [ "city_txt_en", "country_txt_pt" ], "tie_breaker": 0.0 } }, "profile": true }

Después de perfilar la consulta, el resultado es:

(+city_txt_en:bangkok +city_txt_en:tailandia) (+country_txt_pt:bangkok +country_txt_pt:tailandia)

No funciona correctamente porque Elasticsearch intenta hacer coincidir ambos términos en los campos de city y country . El problema es que el término bangkok está en inglés y el término tailandia está en portugués.

Si configuro un analizador en la consulta, la consulta de lucene es la esperada:

+(city_txt_en:bangkok | country_txt_pt:bangkok) +(city_txt_en:tailandia | country_txt_pt:tailandia)

Pero ahora el problema es que debo usar el mismo analizador de consultas para ambos idiomas. Necesito una forma de generar la consulta de lucene anterior utilizando diferentes analizadores de consultas por idioma.


Según los documentos, cross_fields exige que todos los campos tengan el mismo analizador

Lo que podría hacer, sin embargo, es dividir su consulta en dos partes como esta, donde cada parte tiene la misma posibilidad de coincidir. Aquí podría usar una match ya que cada multi_match tiene un solo campo, pero también puede agregar otros campos que tengan el mismo analizador en cada subconsulta.

{ "bool": { "should": [ { "multi_match" : { "query" : "bangkok tailandia", "type": "cross_fields", "operator": "and", "fields" : [ "city_txt_en" ], "minimum_should_match": "50%" } }, { "multi_match" : { "query" : "bangkok tailandia", "type": "cross_fields", "operator": "and", "fields" : [ "country_txt_pt" ] } } ] } }