Fundamentos de Sintaxe e Operações REST no Elasticsearch

Tipos de Dados e Mapeamento

No Elasticsearch, a definição estrutural dos documentos é feita através de mapeamentos (mappings). Os tipos de dados primitivos e complexos mais utilizados incluem:

  • Textuais: text (analisado e tokenizado) e keyword (exato, não analisado).
  • Numéricos: long, integer, short, byte, double, float, half_float, scaled_float.
  • Temporais: date e date_nanos.
  • Lógicos e Binários: boolean e binary.

Interação via API REST

A comunicação com o cluster é realizada através de requisições HTTP. Nas versões modrenas do Elasticsearch (7.x e superiores), o conceito de "tipos" (types) foi descontinuado, utilizando-se o endpoint _doc para manipulação de documentos. O índice atua de forma análoga a um banco de dados ou tabela no modelo relacional.

  • Criar/Atualizar (ID específico): PUT /indice/_doc/id
  • Criar (ID aleatório): POST /indice/_doc
  • Buscar: POST /indice/_search
  • Atualização Parcial: POST /indice/_doc/id/_update
  • Recuperar por ID: GET /indice/_doc/id
  • Remover: DELETE /indice/_doc/id

Operações no Kibana Dev Tools

Criação de Índice e Mapeamento

Ao criar um índice, é uma boa prática definir explicitamente o mapeamento dos campos para evitar inferências incorretas pelo mecanismo de análise dinâmica.

PUT /usuarios
{
  "mappings": {
    "properties": {
      "nome_completo": {
        "type": "text"
      },
      "codigo_identificador": {
        "type": "keyword"
      },
      "idade": {
        "type": "integer"
      },
      "data_cadastro": {
        "type": "date"
      }
    }
  }
}

Inserção de Documentos

A indexação de um novo documento pode ser feita informando um identificador único. Se o documento já existir, a operação funcionará como uma substituição completa (upsert).

PUT /usuarios/_doc/101
{
  "nome_completo": "Carlos Silva",
  "codigo_identificador": "USR-992",
  "idade": 28,
  "data_cadastro": "2023-10-15T10:00:00"
}

Atualização Parcial

Para modificar apenas campos específicos sem sobrescrever o documento inteiro, utiliza-se o endpoint _update envolvendo os dados na chave doc.

POST /usuarios/_doc/101/_update
{
  "doc": {
    "idade": 29
  }
}

Exclusão de Índices

DELETE /usuarios

Consultas e Recuperação de Dados

Enspeção do Cluster

Para listar todos os índices existentes e suas métricas de saúde e tamanho:

GET _cat/indices?v

Buscas Simples e Filtros de URL

Recuperação de um documento específico ou busca rápida via query string:

GET /usuarios/_doc/101

GET /usuarios/_search?q=idade:28

Consultas Estruturadas (Query DSL)

Para lógicas complexas, o Query DSL permite combinar múltiplas condições. A estrutura bool é fundamental, onde must atua como um operador AND e should como OR.

GET /usuarios/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "nome_completo": "Carlos" } }
      ],
      "filter": [
        { "term": { "codigo_identificador": "USR-992" } },
        { "range": { "idade": { "gte": 20, "lte": 30 } } }
      ]
    }
  }
}

Ordenação, Paginação e Projeção

Ao aplicar ordenação manual, a pontuação de relevância (_score) é ignorada. A paginação é controlada por from e size, e a projeção de campos por _source.

GET /usuarios/_search
{
  "_source": ["nome_completo", "idade"],
  "query": {
    "match_all": {}
  },
  "sort": [
    { "idade": { "order": "desc" } }
  ],
  "from": 0,
  "size": 10
}

Term vs Match e Destaque (Highlighting)

A diferença crucial entre text e keyword reside na análise léxica. Campos text são quebrados em tokens (ideais para match e buscas textuais), enquanto keyword mantém a string intacta (ideais para term, aggregations e filtros exatos).

Para realçar os termos encontrados em campos textuais:

GET /usuarios/_search
{
  "query": {
    "match": {
      "nome_completo": "Silva"
    }
  },
  "highlight": {
    "fields": {
      "nome_completo": {
        "pre_tags": ["<strong>"],
        "post_tags": ["</strong>"]
      }
    }
  }
}

Tags: elasticsearch Kibana query-dsl rest-api Search-Engine

Publicado em 7-3 01:47