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.
Top comments (0)