#008: Como definir o mapeamento no Elasticsearch
Bruno Flegler Dal'Col
Posted on August 30, 2021
O mapeamento defini como cada campo do documento será indexado. Uma vez que não é definido o tipo do campo o Elasticsearch irá definir dinamicamente. Podemos ver o mapping
criado no nosso índice customers
.
GET /customers/_mapping
{
"customers" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"createdAt" : {
"type" : "date"
},
"email" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
Os tipos sugeridos pelo Elasticsearch:
Campo | Tipo | Valor |
---|---|---|
age | long | 18 |
createdAt | date | "2021-08-21T03:16:33.116Z" |
text | "Antonia.Will@gmail.com" | |
id | long | 55 |
name | text | "Mrs. Mable Ritchie" |
⚠️ Atenção:
Uma vez que o índice é definido não podemos mais alterar o tipo do campo, apenas adicionar um campo novo. Da mesma forma não será mais possível indexar um documento com outro formato. Vamos tentar indexar um documento com o
id
aabcdef
.
POST /customers/_doc
{
"id": "abcdef",
"name": "Brenda H. Barajas",
"email": "bredahbarajas@hotmail.com",
"age": 97,
"createdAt": "2021-08-29T19:16:33.099Z"
}
O Elasticsearch indica que não é possível transformar abcedf
em um valor numérico.
{
"error" : {
"root_cause" : [
{
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [id] of type [long] in document with id 'q64NlHsBLpS_vORe78sd'. Preview of field's value: 'abcdef'"
}
],
"type" : "mapper_parsing_exception",
"reason" : "failed to parse field [id] of type [long] in document with id 'q64NlHsBLpS_vORe78sd'. Preview of field's value: 'abcdef'",
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "For input string: \"abcdef\""
}
},
"status" : 400
}
Vamos deletar o índice customers
e criar ele novamente definindo o mapping antes.
DELETE customers
Agora podemos criar o mapping antes de indexar o primeiro documento.
PUT /customers
{
"mappings": {
"properties": {
"id": {
"type": "text"
},
"age": {
"type": "integer"
},
"email": {
"type": "text"
},
"name": {
"type": "text"
},
"createdAt": {
"type": "date"
}
}
}
}
Se olharmos o mapping agora o id
será do tipo text
e conseguiríamos indexar com o valor abcdef
.
O mapeamento é um tema complexo, envolve os tipos dos campos e depende de um conhecimento prévio do documento que será indexado para conseguir otimizar as buscas. Com o tempo vamos entender quais tipos são sugeridos para cada tipo de situação.
Posted on August 30, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.