Исключение синтаксического анализатора
Я пытаюсь создать вложенный документ в ElasticSearch.
Структура: заголовок, имя, комментарии комментарии - это вложенный документ, внутри которого - Comment & Star_Rating. Внутри комментарий, имя и адрес.
Вот запрос, упомянутый ниже.
PUT /sounduu
{
"mappings": {
"blogpost": {
"properties": {
"title": {
"type": "string"
},
"name": {
"type": "string"
},
"comments": {
"properties": {
"comment": {
"properties": {
"name": {
"type": "string"
},
"address": {
"type": "string"
}
}
},
"star_rating": {
"type": "long"
}
}
}
}
}
}
}
PUT /sounduu/blogpost/1
{
"title": "someh_title",
"name":"soundy",
"comments": {
"comment":"kuu",
[{
"name":"juwww",
"address":"eeeey"
},
{
"name":"jj",
"address":oo"
}]
},
"star_rating":6
}
Ошибка:
{
"error": {
"root_cause": [
{
"type": "mapper_parsing_exception",
"reason": "object mapping for [comments.comment] tried to parse field [comment] as object, but found a concrete value"
}
],
"type": "mapper_parsing_exception",
"reason": "object mapping for [comments.comment] tried to parse field [comment] as object, but found a concrete value"
},
"status": 400
}
Может кто-нибудь помочь с этим?
1 ответ
В вашем PUT /sounduu/blogpost/1
запрос, что вы пытаетесь обработать свойство "comment" как вложенный объект и строку.
Форматируя JSON вашего запроса, вы можете наблюдать проблему:
{
"title": "someh_title",
"name": "soundy",
"comments": {
"comment": "kuu",
[{
"name": "juwww",
"address": "eeeey"
},
{
"name": "jj",
"address": oo"
}]
},
"star_rating":6
}
Вам нужно либо обновить отображение, чтобы включить свойство "текст", и переместить "comment": "kuu"
содержание соответственно, или опустите его в вашем запросе для работы с вашим текущим отображением.
Пример здесь - мне кажется логичным сгруппировать все так:
PUT /sounduu
{
"mappings": {
"blogpost": {
"properties": {
"title": {
"type": "string"
},
"name": {
"type": "string"
},
"comments": {
"properties": {
"text" : {
"type": "string"
},
"name": {
"type": "string"
},
"address": {
"type": "string"
}
}
},
"star_rating": {
"type": "long"
}
}
}
}
}
Запрос на индексирование будет выглядеть так:
{
"title": "someh_title",
"name": "soundy",
"comments": [
{
"text": "kuu",
"name": "juwww",
"address": "eeeey"
},
{
"text": "kuu2",
"name": "jj",
"address": oo"
}
],
"star_rating":6
}
Если вы используете elasticSearch более поздней версии, то рекомендуется заменить тип данных "строка" на "текст". Сообщество ElasticSearch отказалось от слова "строка".
Реформированный запрос должен быть:
`PUT /sounduu
{
"mappings": {
"blogpost": {
"properties": {
"title": {
"type": "text"
},
"name": {
"type": "text"
},
"comments": {
"properties": {
"text" : {
"type": "text"
},
"name": {
"type": "text"
},
"address": {
"type": "text"
}
}
},
"star_rating": {
"type": "long"
}
}
}
}
}`