Elasticsearch переиндексирует динамически сопоставленные данные о местоположении в геоформу

Я записал некоторые данные в Elasticsearch. Но мой шаблон не работает хорошо, и данные о моем местоположении отображаются динамически. Я хочу переиндексировать все данные с помощью скрипта запроса. Как преобразовать данные о местоположении в геоформу?

Пример данных:

{
  "deviceId": "dev1",
  "location": {
     "type": "Point",
     "coordinates": [
          28.891983032226562,
          41.02446333535115
     ]
  }
}

type поле сопоставлено text, а coordinates сопоставлено float.

test3 запрос сопоставления индекса:

PUT /test3
{
    "mappings": {
        "doc": {
            "properties": {
                "location": {
                    "type": "geo_shape",
                    "tree": "quadtree",
                    "precision": "100m"
                }
            }
        }
    }
}

Мой скрипт переиндексации (отредактированный):

POST _reindex
{

  "size": 1000,
  "source": {

    "index": "test"
    , "query": {
      "constant_score": {
      "filter": {
        "exists": {
          "field": "location"
        }
      }
    }
    }
  },
  "dest": {
    "index": "test3"
  },
  "script":{
    "inline": "if(ctx._source.location.size()>1) {ctx._source.templocation=ctx._source.remove('location'); ctx._source['location.type'] = 'Point';  ctx._source['location.coordinates'] = ctx._source.templocation; ctx._source.remove('templocation'); } "
  }
}

Ответ эластичного поиска:

{
  "took": 172,
  "timed_out": false,
  "total": 2,
  "updated": 0,
  "created": 0,
  "deleted": 0,
  "batches": 1,
  "version_conflicts": 0,
  "noops": 0,
  "retries": {
    "bulk": 0,
    "search": 0
  },
  "throttled_millis": 0,
  "requests_per_second": -1,
  "throttled_until_millis": 0,
  "failures": [
    {
      "index": "test3",
      "type": "data",
      "id": "AWXsdV-z29dKQeP_vT68",
      "cause": {
        "type": "illegal_argument_exception",
        "reason": "[location] is defined as an object in mapping [data] but this name is already used for a field in other types"
      },
      "status": 400
    },
    {
      "index": "test3",
      "type": "data",
      "id": "AWXsdVAP29dKQeP_vT67",
      "cause": {
        "type": "illegal_argument_exception",
        "reason": "[location] is defined as an object in mapping [data] but this name is already used for a field in other types"
      },
      "status": 400
    }
  ]
}

Результат для curl -XGET localhost:9200/test3

{
  "test3": {
    "aliases": {},
    "mappings": {
      "doc": {
        "properties": {
          "location": {
            "type": "geo_shape",
            "tree": "quadtree",
            "precision": "100.0m"
          }
        }
      }
    },
    "settings": {
      "index": {
        "creation_date": "1537333568669",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "uuid": "K78hBgskSkKIg-Itb7uqvA",
        "version": {
          "created": "5060499"
        },
        "provided_name": "test3"
      }
    }
  }
}

person Bilal Demir    schedule 18.09.2018    source источник
comment
что вы пробовали до сих пор? Вы должны показать свою попытку.   -  person Ashwani Shakya    schedule 18.09.2018
comment
Вопрос @AshwaniShakya обновлен. Спасибо   -  person Bilal Demir    schedule 18.09.2018
comment
Перейдите по этой ссылке (discuss.elastic.co/t/change-data- тип/87852/8)   -  person Ashwani Shakya    schedule 18.09.2018
comment
@AshwaniShakya Страница содержит простые преобразования типов данных. Мне нужно преобразование геоформы.   -  person Bilal Demir    schedule 19.09.2018


Ответы (1)


У вас опечатка в скрипте, одну болтающуюся закрывающую квадратную скобку надо убрать

"inline": "... ctx._source['location.coordinates'] = ctx._source.templocation]; ctx._source.remove('templocation'); } "
                                                                             ^
                                                                             |
                                                                        remove this
person Val    schedule 19.09.2018
comment
Спасибо. Исключение запроса изменено. Новый результат: причина: [местоположение] определено как объект в сопоставлении [данные], но это имя уже используется для поля в других типах - person Bilal Demir; 19.09.2018
comment
Да, это потому, что в целевом индексе вам нужно убедиться, что location правильно отображается как geo_shape, прежде чем запускать переиндексацию. - person Val; 19.09.2018
comment
Да, в моем целевом индексе поле location отображается как geo_shape. Я уверен - person Bilal Demir; 19.09.2018
comment
можете ли вы обновить свой вопрос с результатом, полученным от curl -XGET localhost:9200/test2? - person Val; 19.09.2018
comment
это не то, о чем я спрашивал, проверьте завиток, о котором я упоминал, но используйте test3 вместо test2 - person Val; 19.09.2018
comment
Я попробовал скрипт для нового index. Запрос обновлен с помощью test3 - person Bilal Demir; 19.09.2018
comment
Хорошо, я снова пишу свой комментарий: можете ли вы обновить свой вопрос с результатом, полученным от выполнения следующей команды curl -XGET localhost:9200/test3 (не запроса на переиндексацию) - person Val; 19.09.2018
comment
Добавлен ответ на запрос curl. - person Bilal Demir; 19.09.2018
comment
где у вас есть сопоставление под названием data? - person Val; 19.09.2018
comment
Вы хотите отобразить тело запроса на размещение? Я добавил запрос на сопоставление. - person Bilal Demir; 19.09.2018