Elasticsearch незаконное отображение массива местоположений - PullRequest
1 голос
/ 16 марта 2020

Я хотел бы выполнить геолокационные запросы с помощьюварезинкового поиска в моем наборе данных, который выглядит следующим образом:

{"index": {"_index": "city","_type":"city_info", "_id":0} }
{"fields": { "city" : "AGAWAM", 
             "loc" : [ -72.622739, 42.070206 ], 
             "pop" : 15338, "state" : "MA"},
             "id" : "01001" ,
             "type" : "add"}
...

Я могу выполнять множество запросов или агрегатов без каких-либо проблем, но когда дело доходит до запроса с геодезическим фильтром или чем-то, что работает с географическими c координатами, это не работает. Вот мой картографический тест:

PUT /city/_mappings
{
  "properties": {
    "fields.loc": {
      "type": "geo_point"
    }
  }
}

Я получаю эту ошибку.

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "mapper [fields.loc] of different type, current_type [float], merged_type [geo_point]"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "mapper [fields.loc] of different type, current_type [float], merged_type [geo_point]"
  },
  "status" : 400
}

Так что, похоже, мои "fields.lo c" - это float, тогда как в JSON это массив со значениями с плавающей точкой. Я пытался увидеть, что на самом деле было типом "lo c", и это действительно число с плавающей точкой, чего я не понимаю, почему:

GET /city/_mapping
{
  "city" : {
    "mappings" : {
      "properties" : {
        "fields" : {
          "properties" : {
            "city" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "loc" : {
              "type" : "float"
...

Так что я не понимаю, а точнее я не знаю, как изменить "lo c" с плавающей точки на точку geo_point. Так как я новичок в работе сasticsearch, я использую только эластичный поиск и кибану для cURL.

1 Ответ

1 голос
/ 16 марта 2020

Как только вы неявно установите тип данных для float (путем массовой синхронизации, как вы, вероятно, сделали), будет трудно преобразовать float в geo_points. Я бы рекомендовал сбросить индекс, установить правильное сопоставление с типом данных geo_point и выполнить повторную синхронизацию.

Если вы хотите глубже go, взгляните на _reindex api. Вот быстрые слова . Это то, с чем вы, вероятно, столкнетесь, когда ваша система будет работать в производственной среде, где удаление теперь является опцией.

FYI, использование пользовательского типа _do c устарело.

...