Как преобразовать существующие координаты в ElasticSearch в геопоинт - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь преобразовать широту и долготу в geo_points в ElasticSearch.Проблема в том, что у меня уже есть загруженные данные значений широты и долготы в эластичном поиске, но у меня проблемы с их преобразованием.У меня такое ощущение, что есть решение, использующее безболезненно, но я не совсем точно определил его.

Вот как выглядит карта

{
  "temporary_index" : {
    "mappings" : {
      "handy" : {
        "properties" : {
          "CurrentLocationObj" : {
            "properties" : {
              "lat" : {
                "type" : "float"
              },
              "lon" : {
                "type" : "float"
              }
            }
          },
          "current_latitude" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "current_longitude" : {
            "type" : "text",
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          },
          "location" : {
            "type" : "geo_point"
          },
        }
      }
    }
  }
}

И это пример документавыглядит как

"hits" : [
      {
        "_index" : "temporary_index",
        "_type" : "handy",
        "_id" : "9Q8ijmsBaU9mgS87_blD",
        "_score" : 1.0,
        "_source" : {
          "current_longitude" : "139.7243101",
          "current_latitude" : "35.6256271",
          "CurrentLocationObj" : {
            "lat" : 35.6256271,
            "lon" : 139.7243101
          }

Очевидно, что есть еще поля, но я удалил их для ясности.

Это то, что я пробовал.

POST temporary_index/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": {
    "inline": "ctx._source.location = [ctx._source.current_latitude, ctx._source.current_longitude]",
    "lang": "painless"
  }
}

Однако я получаю следующую ошибку:

"reason": "failed to parse field [location] of type [geo_point]",
        "caused_by": {
          "type": "parse_exception",
          "reason": "unsupported symbol [.] in geohash [35.4428348]",
          "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "unsupported symbol [.] in geohash [35.4428348]"
          }
        }

Я использовал следующий стекопоток в качестве основы для своего решения, но я явно что-то делаю не так.Любой совет полезен!Благодарю.

Обмен координат географических точек в индексе эластичного поиска

1 Ответ

0 голосов
/ 28 июня 2019

Отличное начало! Ты почти у цели.

Просто обратите внимание, что при указании geo_point в качестве массива долгота должна быть первым элементом, а широта - следующей. Тем не менее, я предлагаю вам сделать это так, и это будет работать:

POST temporary_index/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": {
    "inline": "ctx._source.location = ['lat': ctx._source.current_latitude, 'lon': ctx._source.current_longitude]",
    "lang": "painless"
  }
}
...