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) ekeyword(exato, não analisado). - Numéricos:
long,integer,short,byte,double,float,half_float,scaled_float. - Temporais:
dateedate_nanos. - Lógicos e Binários:
booleanebinary.
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>"]
}
}
}
}