#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 ^