Lección 7 de 20 · Lectura y práctica
Implementar full-text queries con match y multi_match
Concepto claveLas consultas match y multi_match son los caballos de batalla del Query DSL de Elasticsearch para búsqueda full-text. Mientras que match busca términos en un único campo analizado, multi_match extiende esta.
Del concepto a la práctica
Taller de esta lección
match concentra la búsqueda en un campo analizado; multi_match distribuye la misma intención entre varios campos con pesos distintos. Esto importa cuando una palabra puede aparecer en el título o en la descripción y no quieres exigir que todo esté en un solo lugar.
Ejemplo resuelto
{"query":{"multi_match":{"query":"cargador portátil","fields":["titulo^3","descripcion"]}}}Si el producto A contiene ambos términos en titulo y el B solo los contiene en descripcion, A recibe una prioridad mayor por el peso declarado, siempre que el resto de condiciones sea comparable.
Usa A={titulo:"cargador portátil",descripcion:"accesorio"} y B={titulo:"accesorio",descripcion:"cargador portátil"}, con ambos campos text y el mismo analizador. No se promete un score ni ranking exacto de BM25: el boost favorece un campo, pero longitud, frecuencia y estadísticas del índice también influyen.
Pruébalo
Crea dos documentos con esa distribución.
Ejecuta primero
matchsobretitulo.Ejecuta después
multi_matchsobre ambos campos.Compara qué documento aparece en cada caso.
Comprueba tu resultado
Error frecuente: usar term para una frase analizada y perder coincidencias por mayúsculas o acentos. Corrige con match o multi_match. El ejercicio debe mostrar que match puede omitir B, mientras multi_match recupera A y B.

Mapa de prácticaEl analizador convierte texto en términos que la consulta utiliza para buscar documentos. Los filtros restringen qué documentos pueden aparecer y el ranking ordena los resultados según relevancia; filtrar no significa aumentar la puntuación. En un recorrido independiente, las agregaciones resumen grupos de datos para un dashboard. Las cifras y gráficos de ese recorrido son ilustrativos, no una medición de rendimiento.
Ver la infografía en tamaño completo ↗Concepto clave
Las consultas match y multi_match son los caballos de batalla del Query DSL de Elasticsearch para búsqueda full-text. Mientras que match busca términos en un único campo analizado, multi_match extiende esta funcionalidad a múltiples campos simultáneamente, permitiendo construir experiencias de búsqueda más ricas y relevantes.
Imagina que estás construyendo un motor de búsqueda para una plataforma de e-commerce. Un usuario busca "zapatillas running Nike". Con match en el campo title, encontrarías productos cuyo título contenga esos términos. Pero ¿qué pasa si la descripción del producto o sus características también son relevantes? Aquí es donde multi_match brilla, permitiendo buscar en title, description y tags al mismo tiempo, mejorando significativamente el recall.
Ambas consultas utilizan el analizador del campo para procesar el texto de búsqueda (tokenización, eliminación de stop words, stemming, etc.) antes de ejecutar la búsqueda. Esto las diferencia de consultas como term que trabajan con términos exactos. La elección entre ellas no es binaria; en sistemas avanzados, se combinan en consultas compuestas para afinar la precisión y el recall según el caso de uso.
Cómo funciona en la práctica
Vamos a desglosar la implementación paso a paso usando un índice de artículos de noticias.
Paso 1: Configuración del índice
PUT /noticias
{
"mappings": {
"properties": {
"titulo": { "type": "text", "analyzer": "spanish" },
"contenido": { "type": "text", "analyzer": "spanish" },
"etiquetas": { "type": "text", "analyzer": "keyword_lowercase" },
"fecha": { "type": "date" }
}
}
}Paso 2: Consulta match básica
Buscar "crisis económica" en el campo contenido:
GET /noticias/_search
{
"query": {
"match": {
"contenido": "crisis económica"
}
}
}Elasticsearch analizará "crisis económica" (posiblemente normalizando a "crisis economica" sin tilde) y buscará documentos donde contenido contenga crisis Y economica (por defecto, operador OR). Puedes cambiar a AND:
"match": {
"contenido": {
"query": "crisis económica",
"operator": "and"
}
}Paso 3: Consulta multi_match
Extender la búsqueda a múltiples campos con diferentes pesos:
GET /noticias/_search
{
"query": {
"multi_match": {
"query": "crisis económica",
"fields": ["titulo^3", "contenido^2", "etiquetas"],
"type": "best_fields"
}
}
}El símbolo^seguido de un número (ej.^3) asigna un boost o peso a ese campo. Un match entitulovale 3 veces más que enetiquetas.
El parámetro type controla cómo se combinan los scores. best_fields (por defecto) toma el score más alto de cualquier campo, ideal para campos que se excluyen mutuamente. most_fields suma los scores, útil cuando los campos contienen información similar analizada de forma diferente.
Caso de estudio
Escenario: Un portal de empleo necesita mejorar su búsqueda de vacantes. Los usuarios buscan por puesto, habilidades y ubicación, pero la relevancia actual es baja porque la búsqueda solo considera el título del puesto.
Solución implementada: Se creó una consulta multi_match que busca en:
titulo^4(alto boost, ya que es el campo principal)descripcion^2habilidades(array de texto)ubicacion
Con type: "cross_fields" para tratar los campos como un solo campo grande, lo que ayuda cuando los términos están distribuidos (ej. "desarrollador" en título y "Java" en habilidades).
Consulta de ejemplo:
GET /vacantes/_search
{
"query": {
"multi_match": {
"query": "desarrollador Java remoto",
"fields": ["titulo^4", "descripcion^2", "habilidades", "ubicacion"],
"type": "cross_fields",
"operator": "and"
}
}
}Resultado: Aumento del 40% en la tasa de clics en resultados de búsqueda, ya que las vacantes ahora aparecen cuando coinciden términos clave en cualquier campo relevante, no solo en el título.
Errores comunes
- Usar match en campos no analizados (keyword):
matchespera texto analizado. Si se aplica a un campokeyword, buscará coincidencia exacta con la cadena completa, lo que rara vez es útil. Solución: Usartermpara keywords o asegurar que el mapping sea correcto. - Ignorar el efecto del analizador: Si el analizador del campo elimina stop words o aplica stemming, "crisis económica" podría buscar por "crisis economica" (sin tilde). Esto puede causar confusiones si no se entiende. Solución: Probar consultas con
_analyzeAPI para ver cómo se tokeniza. - Abusar de multi_match sin boost: Buscar en muchos campos sin pesos puede diluir la relevancia. Un match en un campo secundario podría rankear más alto que uno en el campo principal. Solución: Asignar boosts basados en importancia del campo para el negocio.
- No considerar el tipo de multi_match: Usar
best_fieldscuando se necesitamost_fieldso viceversa puede dar resultados subóptimos. Solución: Entender la semántica de los datos y elegirtypeacorde:best_fieldspara campos únicos (título vs cuerpo),most_fieldspara sinónimos (descripción en inglés y español). - Olvidar el operador por defecto (OR):
matchusaORpor defecto, lo que puede devolver muchos resultados irrelevantes. Solución: Cambiar a"operator": "and"para consultas precisas, o usarminimum_should_matchpara un balance.
Checklist de dominio
- Puedo explicar la diferencia entre
match(un campo) ymulti_match(múltiples campos) y cuándo usar cada una. - Sé cómo asignar boosts a campos en
multi_matchusando la sintaxiscampo^peso. - Puedo listar y diferenciar al menos tres tipos de
multi_match:best_fields,most_fields, ycross_fields. - Entiendo cómo el analizador del campo afecta la tokenización de la consulta en
matchymulti_match. - Sé cambiar el operador por defecto de
ORaANDen una consultamatch. - Puedo identificar cuándo no usar
match/multi_match(ej., para búsqueda exacta en campos keyword). - He probado consultas con
_analyzepara depurar problemas de tokenización.
Optimizar búsqueda de productos en un e-commerce con match y multi_match
Eres un Search Engineer en una empresa de e-commerce. El índice productos tiene los campos: nombre (texto, analizador español), descripcion (texto, analizador español), categoria (keyword), marca (keyword), y precio (float). Los usuarios se quejan de que las búsquedas no encuentran productos relevantes cuando usan múltiples términos.
Objetivo:
Implementar y probar consultas match y multi_match para mejorar la relevancia.
Pasos:
- Preparar datos de prueba: Inserta al menos 5 documentos en el índice
productoscon datos variados (ej., "Zapatillas Nike Air Max", "Camiseta Adidas de running", etc.). Usa la API_bulkpara eficiencia. - Consulta match básica: Ejecuta una consulta
matchen el camponombrepara "zapatillas running". Observa los resultados y el scoring. Luego, cambia el operador aANDy compara. - Implementar multi_match: Crea una consulta
multi_matchque busque "zapatillas running" en los camposnombre(boost 3),descripcion(boost 2), ymarca. Usatype: "best_fields". Ejecuta y analiza si los resultados mejoran. - Experimentar con tipos: Cambia el
typeamost_fieldsy luego across_fields. Para cada uno, ejecuta la consulta con "zapatillas Nike" y observa diferencias en el orden de resultados. Explica brevemente por qué cambia. - Depurar tokenización: Usa la API
_analyzepara ver cómo se tokeniza "zapatillas running" con el analizador español. Compara con cómo se tokeniza "running shoes" (en inglés) si cambiaras el analizador. Esto te ayudará a entender por qué algunas búsquedas no funcionan como esperas.
Entrega un breve informe con: (a) las consultas usadas, (b) observaciones sobre los resultados, y (c) recomendaciones para producción (ej., qué tipo y boosts usar).
Pistas
- Recuerda que los campos keyword no se analizan; para incluirlos en multi_match, considera si necesitas búsqueda exacta o full-text.
- Usa la herramienta Dev Tools de Kibana para ejecutar las consultas y ver los resultados en tiempo real.
- Prueba con consultas que mezclen términos presentes en diferentes campos (ej., "Nike" en marca y "correr" en descripción) para ver el efecto de cross_fields.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Implementación Avanzada de Búsqueda Full-Text y Analytics con Elasticsearch y Kibana
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.