Dominando a DSL de Consultas do Elasticsearch: Comandos Essenciais para Recuperação de Dados
O Elasticsearch é renomado por sua velocidade e flexibilidade no tratamento de volumes massivos de dados não estruturados e estruturados. No cerne de seu poder de recuperação reside a Linguagem de Domínio Específica de Consulta (Query DSL) — uma poderosa linguagem baseada em JSON usada para definir solicitações de pesquisa sofisticadas por meio da API de Pesquisa (Search API). Compreender a Query DSL é crucial para ir além de pesquisas simples por palavras-chave e realizar recuperações de dados precisas, filtradas e agregadas.
Este guia irá guiá-lo pelos componentes fundamentais da Elasticsearch Query DSL. Exploraremos os tipos de consulta principais, demonstraremos como combiná-los para lógica complexa usando consultas bool e forneceremos exemplos práticos para ajudá-lo a dominar a recuperação eficiente de dados de seus índices.
A Anatomia de uma Solicitação de Pesquisa do Elasticsearch
Todas as pesquisas do Elasticsearch são executadas no endpoint _search de um índice (ou índices) específico. Uma solicitação de pesquisa básica é uma solicitação POST que contém um corpo JSON que define os parâmetros da consulta. A parte mais crítica deste corpo é o objeto query.
Estrutura Básica:
POST /nome_do_seu_indice/_search
{
"query": { ... Defina sua estrutura de consulta aqui ... },
"size": 10,
"from": 0
}
Tipos de Consulta Principais: Precisão e Relevância
A Query DSL oferece uma vasta gama de consultas adaptadas para diferentes tipos de dados e necessidades de correspondência. A escolha da consulta impacta significativamente tanto a pontuação de relevância quanto o desempenho.
1. Pesquisa de Texto Completo: A Consulta match
A consulta match é o padrão para pesquisa de texto completo em campos analisados. Ela tokeniza o termo de pesquisa e verifica se há tokens correspondentes no(s) campo(s) especificado(s).
Caso de Uso: Pesquisa de texto em linguagem natural onde a pontuação de relevância é importante.
Exemplo: Pesquisar documentos onde o campo 'description' contém a palavra 'nuvem' ou 'computação'.
GET /products/_search
{
"query": {
"match": {
"description": "cloud computing"
}
}
}
2. Correspondência de Valor Exato: A Consulta term
A consulta term pesquisa documentos que contenham o termo exato especificado. Diferentemente de match, ela não realiza análise na string de pesquisa, tornando-a ideal para correspondências exatas em palavras-chave, IDs ou campos indexados numericamente.
Caso de Uso: Filtragem por valores exatos em campos não analisados (como campos keyword ou números).
Exemplo: Recuperar um produto com o ID exato SKU10021.
GET /products/_search
{
"query": {
"term": {
"product_id": "SKU10021"
}
}
}
3. Consultas de Intervalo (Range Queries)
As consultas de intervalo permitem filtrar documentos onde o valor de um campo se enquadra em um intervalo especificado (numérico, data ou string).
Sintaxe: Usa gt (maior que), gte (maior ou igual a), lt (menor que) e lte (menor ou igual a).
Exemplo: Encontrar pedidos feitos após 1º de janeiro de 2024.
GET /orders/_search
{
"query": {
"range": {
"order_date": {
"gte": "2024-01-01",
"lt": "2025-01-01"
}
}
}
}
4. Filtragem por Presença: A Consulta exists
A consulta exists identifica documentos onde um campo específico está presente (ou seja, não é nulo ou ausente).
Exemplo: Encontrar todos os usuários que forneceram um endereço de e-mail.
GET /users/_search
{
"query": {
"exists": {
"field": "email_address"
}
}
}
Construindo Lógica Complexa com a Consulta bool
Para praticamente todas as aplicações de pesquisa do mundo real, você precisa combinar vários critérios. A consulta bool é a ferramenta essencial para isso, permitindo que você combine outras cláusulas de consulta usando lógica Booleana.
Cláusulas dentro de bool
A consulta bool aceita quatro cláusulas principais:
must: Todas as cláusulas dentro deste array devem corresponder. As cláusulas emmustcontribuem para a pontuação de relevância.filter: Todas as cláusulas dentro deste array devem corresponder, mas são executadas em um contexto sem pontuação (non-scoring). Isso as torna muito mais rápidas para critérios estritos de inclusão/exclusão.should: Pelo menos uma cláusula neste array deve corresponder. Essas cláusulas influenciam a pontuação de relevância, mas são opcionais para a correspondência.must_not: Nenhuma das cláusulas neste array deve corresponder (o equivalente a um NÃO lógico).
Exemplo Prático de Consulta bool
Vamos combinar vários conceitos para encontrar documentos de alta prioridade que mencionam 'segurança', mas que excluem rascunhos e estão disponíveis na região 'US'.
GET /logs/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "security breach"
}
}
],
"filter": [
{
"term": {
"region.keyword": "US"
}
}
],
"should": [
{
"term": {
"priority": 5
}
}
],
"must_not": [
{
"term": {
"status.keyword": "DRAFT"
}
}
]
}
}
}
Explicação do Exemplo:
- Must: O documento deve conter a frase "security breach" no campo de conteúdo analisado.
- Filter: O documento deve estar marcado para a região 'US' (uma correspondência exata e rápida).
- Should: Documentos que correspondem a
priority: 5receberão um impulso em sua pontuação de relevância, mas documentos com prioridades mais baixas que atendam às cláusulasmustefilterainda serão retornados. - Must Not: Documentos marcados como 'DRAFT' são estritamente excluídos.
Melhores Práticas para Construção de Consultas
Para garantir que suas pesquisas sejam precisas e eficientes, siga estas diretrizes:
- Prefira
filterem vez demustpara critérios sem pontuação. Se você estiver apenas verificando inclusão/exclusão (por exemplo, filtragem por ID, data exata ou status), sempre use a cláusulafilterdentro de uma consultabool. Isso aproveita o cache e evita cálculos de pontuação caros. - Use Consultas Exatas com Sabedoria: Para campos mapeados como
text(analisados), usematch. Para campos mapeados comokeyword(não analisados), usetermou consultas de intervalo. - Evite Aninhamento Profundo: Embora seja possível, consultas
boolprofundamente aninhadas podem se tornar difíceis de ler e depurar, e às vezes podem levar à degradação do desempenho. - Aproveite
minimum_should_match: Para as cláusulasshould, definirminimum_should_match(por exemplo, para1ou2) força que um certo número desses critérios opcionais seja atendido, transformando-os efetivamente em critérios obrigatórios, enquanto ainda permite que contribuam para a pontuação.
A maestria da Query DSL significa aprender a combinar a ferramenta certa para o trabalho certo — usando o poder analítico de match quando o contexto importa, e a precisão e velocidade de term e filter quando a exatidão é necessária. Ao aplicar esses tipos de consulta fundamentais e alavancar o poder combinatório da consulta bool, você pode construir estratégias de recuperação de dados altamente eficazes e eficientes no Elasticsearch.