Guía de Consultas con DSL en Elasticsearch: Validación, Match y Búsqueda Booleana

Para realizar búsquedas complejas en Elasticsearch, se emplea el DSL (Domain Specific Language). A diferencia de las consultas mediante parámetros en la URL, el DSL utiliza el cuerpo de la solicitud para definir condiciones sofisticadas, permitiendo una gran flexibilidad en la búsqueda, filtrado y agrupación de datos.

Validación de Consultas con _validate

Antes de ejecutar consultas complejas, es recomendable verificar su sintaxis. La API _validate permite comprobar si la estructura del DSL es correcta. Al añadir el parámetro explain, se obtiene información detallada sobre la consulta analizada.

GET /my_store/products/_validate/query?explain
{
  "query": {
    "atch": { 
      "product_title": "python"
    }
  }
}

Una consulta con un error de sintaxis (como "atch" en lugar de "match") devolverá un estado de validación negativo y un mensaje de error. Tras corregir el nombre del operador a "match", la validación será exitosa y el campo "explanation" mostrará la representación interna de la consulta.

Consultas con match

El operador match es fundamental para la búsqueda de texto completo. Realiza una división (tokenización) del término de búsqueda y lo compara con los tokens generados en el índice.

Operaciones Básicas

Recuperar todos los documentos:

GET /my_store/products/_search
{
  "query": { "match_all": {} }
}

Búsqueda condicional y ordenamiento: Para encontrar documentos donde el título contenga "python" y ordenarlos por precio de forma ascendente.

GET /my_store/products/_search
{
  "query": {
    "match": { "product_title": "python" }
  },
  "sort": [ { "unit_price": "asc" } ]
}

Paginación: Controlar la cantidad de resultados mdeiante los parámetros from (offset) y size (limite).

GET /my_store/products/_search
{
  "query": { "match_all": {} },
  "from": 0,
  "size": 10
}

Filtrado de campos en la respuesta: Utilizar _source para especificar exactamente qué campos debe devolver la consulta, mejorando la eficiencia.

GET /my_store/products/_search
{
  "query": { "match_all": {} },
  "_source": ["product_title", "unit_price"]
}

Consulta de Frase Exacta vs. Texto Completo

La indexación y consulta de cadenas de texto dependen del tipo de dato asignado al campo.

Campos de valor exacto (keyword): Para tipos como fechas o identificadores, Elasticsearch no tokeniza el valor de entrada durante la consulta. Se busca la coincidencia exacta. Para lograr esto con texto, se utiliza match_phrase.

GET /my_store/_search
{
  "query": {
    "match_phrase": {
      "product_title": "design patterns"
    }
  }
}

Campos de texto completo (text): Para campos de tipo text, tanto el valor indexado como el término de búsqueda se tokenizan. La consulta match estándar encuentra documentos que contengan cualquiera de los tokens generados, con una puntuación de relevencia.

GET /my_store/_search
{
  "query": {
    "match": {
      "product_description": "design patterns"
    }
  }
}

Control de Precisión en match

Operador booleano: El parámetro operator determina si se requiere la coincidencia de todos los tokens (and) o de al menos uno (or, valor por defecto).

GET /my_store/_search
{
  "query": {
    "match": {
      "product_description": {
        "query": "concurrent programming",
        "operator": "and"
      }
    }
  }
}

Porcentaje mínimo de coincidencia: minimum_should_match establece el umbral mínimo de tokens que deben coincidir, ya sea como un porcentaje o un valor absoluto.

GET /my_store/_search
{
  "query": {
    "match": {
      "product_description": {
        "query": "principles of reactive programming",
        "minimum_should_match": "75%"
      }
    }
  }
}

Búsqueda Multicampo

multi_match permite ejecutar la misma consulta contra múltiples campos. Los documentos que coincidan en cualquiera de ellos serán recuperados.

GET /my_store/_search
{
  "query": {
    "multi_match": {
      "query": "interview questions",
      "fields": ["product_title", "product_description"]
    }
  }
}

Se puede afinar el comportamiento con el parámetro type (ej. cross_fields) y aplicar operadores como and para exigir que todos los términos aparezcan repartidos entre los campos seleccionados.

Consultas Booleanas con bool

La consulta bool combina múltiples cláusulas de filtro, cada una con su lógica. Es la herramienta principal para construir consultas lógicas complejas.

Sus componentes principales son:

  • must: La cláusula debe aparecer en los documentos. Contribuye a la puntuación.
  • filter: Similar a must, pero <strong>no</strong> contribuye a la puntuación. Optimizada para filtros.
  • must_not: La cláusula no debe aparecer en los documentos.
  • should: La cláusula puede aparecer. Aumenta la puntuación si coincide.

Ejemplo de Consulta Compuesta

Este ejemplo busca productos que contengan "python" en el título, excluye aquellos cuya descripción contenga "tutorial", prefiere los del editorial "O'Reilly" y aplica filtros de fecha y precio.

GET /my_store/products/_search
{
  "query": {
    "bool": {
      "must": [ { "match": { "product_title": "python" } } ],
      "must_not": [ { "match": { "product_description": "tutorial" } } ],
      "should": [ { "match": { "publisher": "O'Reilly" } } ],
      "filter": {
        "bool": {
          "must": [
            { "range": { "publication_date": { "gte": "2020-01-01" } } },
            { "range": { "unit_price": { "lte": 50.00 } } }
          ]
        }
      }
    }
  }
}

Consultas Booleanas Anidadas

Las cláusulas bool pueden anidarse para construir lógica más refinada.

GET /my_store/products/_search
{
  "query": {
    "bool": {
      "should": [
        { "term": { "product_title.keyword": "Python Cookbook" } },
        {
          "bool": {
            "must": [ { "match": { "product_tags": "data science" } } ]
          }
        }
      ]
    }
  }
}

Filtrado Directo con constant_score

Cuando se necesita un filtro puro sin ninguna consulta o puntuación, se envuelve dentro de constant_score. Esto es útil para filtros de presencia, rangos o términos exactos.

GET /my_store/products/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": { "unit_price": { "gte": 25.50 } }
      }
    }
  }
}

Control de Mínimos en should

Por defecto, si una consulta bool solo contiene cláusulas should, se requiere que al menos una coincida. Esto se puede ajustar con minimum_should_match.

GET /my_store/products/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "product_title": "javascript" } },
        { "match": { "product_description": "web development" } },
        { "range": { "discount_percentage": { "gte": 10 } } }
      ],
      "minimum_should_match": 2
    }
  }
}

Etiquetas: Elasticsearch DSL match bool query validate API

Publicado el 6-2 08:32