PUT /vehicle/_doc/1
{
"metadata":[
{
"key":"make",
"value":"Saturn"
},
{
"key":"year",
"value":2015
}
]
}
После удаления индекса и последующей попытки индексировать новый документ, как указано выше, выполняются следующие шаги:
- Когда эластик не может найти индекс по имени
vehicle
и автоматическое создание индекса включено (которое по умолчанию включено), оно создаст новый индекс с именем vehicle
. - На основе входного документа, эластик теперь пытается лучше угадать тип данных для полейдокумент.Это известно как отображение динамического поля .
- Для указанного выше документа, поскольку
metadata
является массивом объектов, предполагается, что поле metadata
имеет тип данных object
. - Теперь наступает шаг для определения типа данных полей отдельного объекта.Когда он встречает первый объект, он находит два поля
key
и value
.Оба эти поля имеют строковое значение (make
и Saturn
соответственно) и, следовательно, эластик идентифицирует тип данных для обоих полей как text
. - Эластик, затем попытайтесь определить отображение следующим образом:
{
"properties": {
"metadata": {
"properties": {
"key": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"value": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
Когда он сталкивается со вторым объектом, для которого значение поля value
является числовым (2015), для которого он принимает тип данных как long
.Это приводит к конфликту с ранее идентифицированным типом данных, который был text
.Поле не может иметь смешанный тип данных.Типы данных являются строгими, и, следовательно, ошибки.
Для устранения ошибки необходимо убедиться, что входные значения для полей имеют для каждого объекта того же типа, как показано ниже:
PUT /vehicle/_doc/1
{
"metadata":[
{
"key":"make",
"value":2016
},
{
"key":"year",
"value":2015
}
]
}
Для вышесказанного лучше использовать:
PUT /vehicle/_doc/1
{
"metadata":[
{
"make":"Saturn",
"year": 2015
}
]
}