Сбой переиндексации с массивом, сопоставленным с geo_point - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь переиндексировать после изменения сопоставления одного поля с типа text на тип geo_point.

Существующие данные в исходном индексе выглядят следующим образом:

  "location" : {
    "lat_long" : [
      "49.266498",
      "-122.998938"
    ],

однако при вызове API _reindex я получаю следующие ошибки:

"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 Ответ

1 голос
/ 19 марта 2019

Проблема в том, что в вашем поле source_index, т.е. latitude.lat_long не соответствует ни одно из четырех допустимых представлений, поддерживаемых типом данных geo_point.

В результате происходит сбой преобразования при попытке переиндексации.

Единственное применимое строковое представление будет иметь следующий формат "lat, lon", однако у вас будет [ "lat", "lon" ], который представляет собой не что иное, как массив строк.

Если представление в формате ниже, переиндексирование будет выполнено успешно.

"location" : {
    "lat_long" : "49.266498, -122.998938"
    ]
 }

В качестве решения вы можете выполнить следующие шаги:

Шаг 1: Создать Входной конвейер

Выполните приведенный ниже запрос, чтобы создать конвейер, который преобразует input format из 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 , на этапе переиндексации. Вывод будет в формате, как я уже упоминал выше. Не спешите почитать о встроенном Ingestion API , который есть вasticsearch.

Проверьте, проверьте и дайте мне знать, как это происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...