2015-12-04 3 views
1

Я пытаюсь выполнить геоматерию значения в Elasticsearch, но тип значения client_location задан как строка, и я хотел бы изменить его на geo_point. Когда я запускаю следующее я получаю:Как изменить тип значения в elasticsearch

#curl -XGET "http://core.z0z0.tk:9200/_all/_mappings/http?pretty" 
{ 
    "packetbeat-2015.12.04" : { 
    "mappings" : { 
     "http" : { 
     "properties" : { 
      "@timestamp" : { 
      "type" : "date", 
      "format" : "strict_date_optional_time||epoch_millis" 
      }, 
      "beat" : { 
      "properties" : { 
       "hostname" : { 
       "type" : "string" 
       }, 
       "name" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "bytes_in" : { 
      "type" : "long" 
      }, 
      "bytes_out" : { 
      "type" : "long" 
      }, 
      "client_ip" : { 
      "type" : "string" 
      }, 
      "client_location" : { 
      "type" : "string" 
      }, 
      "client_port" : { 
      "type" : "long" 
      }, 
      "client_proc" : { 
      "type" : "string" 
      }, 
      "client_server" : { 
      "type" : "string" 
      }, 
      "count" : { 
      "type" : "long" 
      }, 
      "direction" : { 
      "type" : "string" 
      }, 
      "http" : { 
      "properties" : { 
       "code" : { 
       "type" : "long" 
       }, 
       "content_length" : { 
       "type" : "long" 
       }, 
       "phrase" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "ip" : { 
      "type" : "string" 
      }, 
      "method" : { 
      "type" : "string" 
      }, 
      "notes" : { 
      "type" : "string" 
      }, 
      "params" : { 
      "type" : "string" 
      }, 
      "path" : { 
      "type" : "string" 
      }, 
      "port" : { 
      "type" : "long" 
      }, 
      "proc" : { 
      "type" : "string" 
      }, 
      "query" : { 
      "type" : "string" 
      }, 
      "responsetime" : { 
      "type" : "long" 
      }, 
      "server" : { 
      "type" : "string" 
      }, 
      "status" : { 
      "type" : "string" 
      }, 
       "type" : { 
      "type" : "string" 
      } 
     } 
     } 
    } 
    } 
} 

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

# curl -XPUT "http://localhost:9200/_all/_mappings/http" -d ' 
> { 
> "http" : { 
>   "properties" : { 
>   "client_location" : { 
>    "type" : "geo_point" 
>   } 
>   } 
> } 
> } 
> ' 
{"error":{"root_cause":[{"type":"merge_mapping_exception","reason":"Merge failed with failures {[mapper [client_location] of different type, current_type [string], merged_type[geo_point]]}"}],"type":"merge_mapping_exception","reason":"Merge failed with failures {[mapper [client_location] of different type, current_type [string], merged_type [geo_point]]}"},"status":400} 

Любое предложение, как правильно ли изменить тип?

Заранее спасибо.

ответ

3

К сожалению, как только вы создали поле, вы больше не можете изменять его тип. Лучше всего это удалить индекс и воссоздать его должным образом с адекватным отображением.

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

# curl -XPUT "http://localhost:9200/_all/_mappings/http" -d '{ 
    "http": { 
    "properties": { 
     "client_location": { 
     "type": "string", 
     "fields": { 
      "geo": { 
      "type": "geo_point" 
      } 
     } 
     } 
    } 
    } 
}' 

И тогда вы можете получить доступ к нему в запросах с использованием client_location.geo. Также обратите внимание, что вам необходимо повторно проиндексировать свои данные, чтобы заполнить это новое подполе ... что означает, что вы можете просто удалить свой индекс и правильно его воссоздать.

UPDATE

После установки Packetbeat вам необходимо убедиться, чтобы установить шаблон packetbeat себя, как описано здесь (т.е. это не делается автоматически): https://www.elastic.co/guide/en/beats/packetbeat/current/packetbeat-getting-started.html#packetbeat-template

curl -XPUT 'http://localhost:9200/_template/packetbeat' [email protected]/etc/packetbeat/packetbeat.template.json 
+0

эти индексы создаются пакетный бит. На кибане отображение корректно, однако поиск elasticsearch имеет неправильный тип. Не знаете, как это исправить. – zozo6015

+0

Можете ли вы обновить свой вопрос с помощью шаблонов, установленных в ES? 'curl -XGET localhost: 9200/_template' – Val

+0

Я не шов, чтобы установить какие-либо шаблоны. – zozo6015