kb.erickguedes.com
Elasticsearch: Busca e Analytics

Query DSL

Aula 2 de 6

Query DSL — Domain Specific Language

O Elasticsearch utiliza uma DSL baseada em JSON para consultas. A Query DSL divide-se em leaf queries (buscam por um campo específico) e compound queries (combinam múltiplas queries).

match — Busca Full-Text

GET /produtos/_search
{
  "query": {
    "match": {
      "nome": "notebook dell"
    }
  }
}

term — Busca Exata

GET /produtos/_search
{
  "query": {
    "term": {
      "categoria": "eletronicos"
    }
  }
}

range — Busca por Intervalo

GET /produtos/_search
{
  "query": {
    "range": {
      "preco": {
        "gte": 1000,
        "lte": 10000
      }
    }
  }
}

exists — Campos Existentes

GET /produtos/_search
{
  "query": {
    "exists": {
      "field": "descricao"
    }
  }
}

bool — Combinação de Queries

GET /produtos/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "nome": "notebook" } }
      ],
      "filter": [
        { "term": { "categoria": "eletronicos" } },
        { "range": { "preco": { "gte": 3000 } } }
      ],
      "should": [
        { "match": { "descricao": "teclado iluminado" } }
      ],
      "must_not": [
        { "term": { "ativo": false } }
      ]
    }
  }
}
CláusulaComportamentoPontuação
mustDeve corresponder (AND)Contribui para o _score
filterDeve corresponder (AND)Ignora _score (cacheável)
shouldDeve corresponder se combinado com mustContribui para o _score
must_notNão deve corresponderIgnora _score

wildcard e regexp

GET /produtos/_search
{
  "query": {
    "wildcard": {
      "nome": "note*"
    }
  }
}

GET /produtos/_search
{
  "query": {
    "regexp": {
      "nome": "not[eo]book"
    }
  }
}

fuzzy — Tolerância a Erros

GET /produtos/_search
{
  "query": {
    "fuzzy": {
      "nome": {
        "value": "notebook",
        "fuzziness": "AUTO"
      }
    }
  }
}

match_phrase — Frase Exata

GET /produtos/_search
{
  "query": {
    "match_phrase": {
      "descricao": "tela de alta resolução"
    }
  }
}

multi_match — Busca em Múltiplos Campos

GET /produtos/_search
{
  "query": {
    "multi_match": {
      "query": "notebook dell",
      "fields": ["nome^3", "descricao", "categoria"],
      "type": "best_fields"
    }
  }
}

Relevância e Scoring

O Elasticsearch usa o algoritmo BM25 para calcular o _score de cada documento.

GET /produtos/_search
{
  "explain": true,
  "query": {
    "match": {
      "nome": "notebook"
    }
  }
}

Boost em Campos

GET /produtos/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "nome": { "query": "notebook", "boost": 3 } } },
        { "match": { "descricao": { "query": "notebook", "boost": 1.5 } } },
        { "match": { "categoria": { "query": "notebook", "boost": 0.5 } } }
      ]
    }
  }
}

function_score

GET /produtos/_search
{
  "query": {
    "function_score": {
      "query": { "match": { "nome": "notebook" } },
      "functions": [
        { "filter": { "term": { "ativo": true } }, "weight": 2 },
        {
          "gauss": {
            "data_criacao": {
              "origin": "2025-06-01",
              "scale": "30d",
              "decay": 0.5
            }
          }
        }
      ],
      "score_mode": "multiply"
    }
  }
}

Highlighting

GET /produtos/_search
{
  "query": {
    "match": { "descricao": "notebook" }
  },
  "highlight": {
    "fields": {
      "descricao": {
        "fragment_size": 100,
        "number_of_fragments": 3,
        "pre_tags": ["<mark>"],
        "post_tags": ["</mark>"]
      }
    }
  }
}

Lab: Query Avançada

# 1. Crie 10 documentos de exemplo com produtos variados
# 2. Faça uma query bool combinando:
#    - must: match no nome "notebook"
#    - filter: range de preço entre 3000 e 10000
#    - should: match na descricao com boost 2
#    - must_not: categoria "usado"
# 3. Execute explain para entender o score
# 4. Teste fuzzy com erro de digitação
# 5. Adicione highlighting no campo descricao
curl -X POST "http://localhost:9200/produtos/_search" \
  -H "Content-Type: application/json" \
  -d '{ "query": { "bool": { "must": [...] } } }'

A Query DSL oferece controle granular sobre relevância com bool queries, boosting e function_score — essencial para e-commerce e busca textual.