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.
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}