#elasticsearch
#elasticsearch
Вопрос:
Я пытаюсь выполнить переиндексацию после изменения сопоставления одного поля с type text на type geo_point
.
Существующие данные в исходном индексе выглядят следующим образом:
"location" : {
"lat_long" : [
"49.266498",
"-122.998938"
],
однако при _reindex
вызове api я получаю следующие сбои:
"cause": {
"type": "mapper_parsing_exception",
"reason": "failed to parse field [location.lat_long] of type [geo_point]",
"caused_by": {
"type": "parse_exception",
"reason": "unsupported symbol [.] in geohash [49.228065]",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "unsupported symbol [.] in geohash [49.228065]"
}
}
},
Ответ №1:
Проблема в том, что в вашем поле source_index
т.Е. latitude.lat_long
не соответствует ни одному из допустимых четырех различных представлений, поддерживаемых geo_point
dataype.
В результате преобразование завершается неудачей при попытке переиндексации.
Единственным применимым представлением строки было бы в приведенном ниже формате "lat, lon"
, однако тот, который у вас есть, [ "lat", "lon" ]
который представляет собой не что иное, как массив строк.
Если представление в приведенном ниже формате, переиндексация будет выполнена успешно.
"location" : {
"lat_long" : "49.266498, -122.998938"
]
}
В качестве решения, что вы можете сделать, это выполнить следующие шаги:
Шаг 1: Создайте конвейер приема
Выполните приведенный ниже запрос, чтобы создать конвейер, который преобразует input format
of latitude.lat_long
в требуемый формат, как я упоминал выше
PUT _ingest/pipeline/my-pipeline-geo
{
"description" : "geo-point pipeline",
"processors" : [
{
"script": {
"lang": "painless",
"source": "ctx.temp = ""; for (def item : ctx.location.lat_long) { if(ctx.temp=="") { ctx.temp = item } else { ctx.temp = ctx.temp ', ' item} }"
}
},
{
"remove": {
"field": "location"
}
},
{
"set": {
"field": "location.lat_long",
"value": "{{temp}}"
}
},
{
"remove": {
"field": "temp"
}
}
]
}
Шаг 2: Выполните приведенный ниже запрос переиндексации
POST _reindex
{
"source": {
"index": "source_index"
},
"dest": {
"index": "dest_index",
"pipeline": "my-pipeline-geo"
}
}
Обратите внимание, как я использовал конвейер, созданный на шаге 1, на этапе переиндексации.
Выходные данные будут в формате, о котором я упоминал выше. Найдите время, чтобы прочитать о встроенном API для приема данных, который есть в elasticsearch.
Протестируйте, подтвердите и дайте мне знать, как это происходит.
Комментарии:
1. привет, @ WindDude, помогло ли вышеупомянутое. Вы ищете что-то еще?