Ошибка переиндексации с массивом, сопоставленным с geo_point

#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, помогло ли вышеупомянутое. Вы ищете что-то еще?