Command Palette

Search for a command to run...

ES·EN

Nivel 2 · 25 min

Query DSL

El Query DSL de Elasticsearch es un lenguaje basado en JSON para definir búsquedas. Entender la diferencia entre query context y filter context, y la semántica de term, match y bool queries, es esencial para construir búsquedas relevantes y eficientes.

Estructura del Bool Query

El bool query es el caballo de batalla de Elasticsearch. Combina cláusulas con cuatro operadores: must (debe coincidir, contribuye al score), filter (debe coincidir, NO afecta el score — cacheado), should (debería coincidir, aumenta el score si lo hace), must_not (no debe coincidir, sin contribución de score). Query context (must, should) calcula scores de relevancia via BM25. Filter context (filter, must_not) es binario y sus resultados se cachean. Siempre mové condiciones que no necesitan scoring a filter para mejor performance.

term vs match vs match_phrase

Las term queries coinciden con valores exactos sin análisis: el valor de búsqueda se compara tal cual contra el valor indexado. Usá term en campos keyword. Las match queries analizan el string de búsqueda antes de hacer matching: la query pasa por el mismo analyzer que el campo indexado. match_phrase requiere que todos los términos aparezcan en el orden exacto. Nunca uses term en un campo text: los tokens analizados del índice no coincidirán con el valor no-analizado de la query.

Relevancia y Boosting

BM25 (Best Match 25) es el algoritmo de scoring por defecto. Considera term frequency (TF: cuántas veces aparece el término en el documento), inverse document frequency (IDF: cuán raro es el término en el índice), y normalización por longitud de campo (campos más cortos puntúan más alto para el mismo match de término). El parámetro boost multiplica la contribución de score de una cláusula. Function score y script score permiten scoring personalizado. Usá la Explain API (_explain) para depurar por qué un documento puntúa como lo hace.

Puntos clave

  • Colocá condiciones que no necesitan scoring en filter context: se cachean y no calculan scores BM25, haciéndolos significativamente más rápidos.
  • term es para keyword (match exacto). match es para text (analizado, full-text). Usar term en un campo text no devuelve resultados porque los tokens analizados difieren de los valores crudos.
  • BM25 premia la frecuencia del término y penaliza los términos comunes (IDF). Usá boost para ponderar cláusulas específicas. Usá _explain para depurar scores inesperados.

Code example

POST /products/_search\n{\n  "query": {\n    "bool": {\n      "filter": [\n        {"term": {"category": "electronics"}'}',\n        {"range": {"price": {"lt": 1000}'}'}\n      ],\n      "must": [\n        {"match": {"name": {"query": "laptop"}'}'}\n      ]\n    }\n  }\n}