Использовать тип данных geo_point в поле в _reindex api

#elasticsearch #kibana

#elasticsearch #kibana

Вопрос:

У меня есть индекс, который содержит два поля: долгота и широта, которые хранятся в виде float. Я хочу создать новый индекс и скопировать данные из первого, но с другими сопоставлениями. Я использую reindex api с процессорами elastic, которые могут переименовывать поля и присваивать им разные типы данных. Когда я пытаюсь создать поле с типом «geo_point», это не удается.

 "type": "parse_exception",
       "reason": "[type] type [geo_point] not supported, cannot convert field.",
  

но когда я создаю новый индекс, я могу создать поле с типом «geo_point».
я пробовал разные обходные пути, но в документации говорится, что с географическими запросами вы можете использовать только тип «geo_point».
есть ли какое-либо решение?

 {
  "description": "test pipe",
  "processors": [
    {
      "convert": {
        "field": "location", 
        "type": "geo_point"
      }
    }
  ]
}
  

добавлено определение канала.

Комментарии:

1. Пожалуйста, покажите ваше определение входного конвейера

2. извините, что так поздно 🙂 добавлено определение конвейера.

3. Не могли бы вы также показать свое отображение и образец документа, пожалуйста?

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

5. У вас действительно есть поле с именем location ? Можете ли вы показать, в чем заключается ошибка создания конвейера?

Ответ №1:

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

 PUT oldindex
{
  "mappings": {
    "doc": {
      "properties": {
        "latitude": {
          "type": "float"
        },
        "longitude": {
          "type": "float"
        }
      }
    }
  }
}
  

Вам нужно создать новый индекс с соответствующим отображением следующим образом

 PUT newindex
{
  "mappings": {
    "doc": {
      "properties": {
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}
  

И затем вы можете просто использовать reindex API для копирования старого индекса в новый с некоторыми дополнительными сценариями для создания поля местоположения:

 POST _reindex
{
  "source": {
    "index": "oldindex",
  },
  "dest": {
    "index": "newindex"
  },
  "script": {
    "source": "ctx._source.location = ['lat': ctx._source.latitude, 'lon': ctx._source.longitude]; ctx._source.remove('latitude'); ctx._source.remove('longitude'); "
  }
}
  

И вы можете использовать поле location в своем новом блестящем индексе!

Комментарии:

1. Спасибо за комментарий! Проблема в том, что я не могу выполнять географические запросы к этому полю, elastic говорит, что это не тип данных geo_point.

2. какое поле?, если вы создадите новый индекс, поле будет правильно отображено

3. Спасибо за помощь, чувак. Это было правильное решение. Извините, что отвечаю с такими большими интервалами.!)

4. Отлично, большое спасибо. Все еще работает, как указано выше, на 7.14 ^