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áusula | Comportamento | Pontuação |
|---|---|---|
must | Deve corresponder (AND) | Contribui para o _score |
filter | Deve corresponder (AND) | Ignora _score (cacheável) |
should | Deve corresponder se combinado com must | Contribui para o _score |
must_not | Não deve corresponder | Ignora _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.