Elasticsearch ofrece diversas alternativas para interacutar con los datos indexados. Fundamentalmente, existen dos metodologías principales para ejecutar búsquedas: el uso de cadenas de consulta (Query String) a través de la URI y el lenguaje de consulta específico de dominio (Query DSL) mediante el cuerpo de la petición.
Preparación del entorno de datos
Antes de explorar los métodos de búsqueda, inicializaremos un índice con datos de ejemplo relacionados con perfiles profesionales para ilustrar los conceptos.
PUT /empleados_tech/_doc/1
{
"nombre": "Roberto Gómez",
"edad": 34,
"sede": "Madrid",
"perfil": "Ingeniero de software especializado en backend y sistemas distribuidos",
"tecnologias": ["Java", "Elasticsearch", "Docker"]
}
PUT /empleados_tech/_doc/2
{
"nombre": "Elena Martínez",
"edad": 28,
"sede": "Barcelona",
"perfil": "Diseñadora UX/UI con enfoque en accesibilidad y prototipado rápido",
"tecnologias": ["Figma", "React", "CSS"]
}
PUT /empleados_tech/_doc/3
{
"nombre": "Javier López",
"edad": 40,
"sede": "Madrid",
"perfil": "Arquitecto de soluciones cloud y experto en ciberseguridad",
"tecnologias": ["AWS", "Terraform", "Python"]
}
PUT /empleados_tech/_doc/4
{
"nombre": "Sofía Castro",
"edad": 25,
"sede": "Valencia",
"perfil": "Desarrolladora frontend junior con pasión por las animaciones web",
"tecnologias": ["JavaScript", "Vue", "Sass"]
}
Búsqueda medianet Query String (URI Search)
Este método es el más sencillo y directo. Consiste en pasar los parámetros de búsqueda directamente en la URL de la petición. Es ideal para pruebas rápidas o filtros básicos donde no se requiere una lógica compleja.
GET /empleados_tech/_search?q=sede:Madrid
En este ejemplo, utilizamos el parámetro q para especificar que deseamos filtrar los documentos donde el campo sede coincida con "Madrid". El resultado típico incluirá metadatos sobre la ejecución y un objeto hits.
Dentro de hits, el campo _score es fundamental. Representa la relevancia del documento respecto a la consulta realizada, calculada mediante algoritmos internos de Elasticsearch (como BM25). Cuanto mayor sea la coincidencia semántica o de frecuencia, mayer será la puntuación obtenida.
Búsqueda mediante Query DSL (Domain Specific Language)
Para escenarios de producción o consultas que involucren lógica booleana, agregaciones o filtros avanzados, se utiliza el Query DSL. Este método emplea un objeto JSON en el cuerpo (body) de la petición GET o POST.
GET /empleados_tech/_search
{
"query": {
"match": {
"sede": "Madrid"
}
}
}
A diferencia del método anterior, la estructura DSL es altamente legible y extensible. En este caso, el nodo query contiene una instrucción match, que indica a Elasticsearch que debe buscar términos que coincidan en el campo especificado.
La respuesta estructurada de una consulta DSL permite analizar no solo los documentos encontrados, sino también el tiempo de ejecución (took), si la consulta excedió el tiempo límite (timed_out) y el estado de los fragmentos (_shards) consultados en el clúster.
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.6931471,
"hits": [
{
"_index": "empleados_tech",
"_id": "1",
"_score": 0.6931471,
"_source": {
"nombre": "Roberto Gómez",
"edad": 34,
"sede": "Madrid",
"perfil": "Ingeniero de software especializado en backend y sistemas distribuidos",
"tecnologias": ["Java", "Elasticsearch", "Docker"]
}
},
{
"_index": "empleados_tech",
"_id": "3",
"_score": 0.6931471,
"_source": {
"nombre": "Javier López",
"edad": 40,
"sede": "Madrid",
"perfil": "Arquitecto de soluciones cloud y experto en ciberseguridad",
"tecnologias": ["AWS", "Terraform", "Python"]
}
}
]
}
}