2015-11-19 2 views
2

Я попытался преобразовать некоторые из полей в ранее проиндексированные данные из строки в целое. Но когда я снова запустил logstash, поля не преобразовались (только в Kibana). Почему я не могу вносить изменения в уже проиндексированные данные, а если нет, как я могу внести необходимые изменения в свой индекс?Почему elasticsearch не позволяет изменять индексированные данные?

Я вносил изменения в logstash. Вот фрагмент logstash.conf:

input { 
    file { 
    type => "movie" 
    path => "C:/TestLogs/Test5.txt" 
    start_position => "beginning" 
    } 
} 

filter { 
    grok { 
      match => {"message" => "(?<Movie_Name>[\w.\-\']*)\s(?<Rating>[\d.]+)\s(?<No. Of Downloads>\d+)\s(?<No. of views>\d+)" } 
     } 
    mutate { 
     convert => {"Rating" => "float"} 
     convert => {"No. of Downloads" => "integer"} 
     convert => {"No. of views" => "integer"} 
     } 
} 

ответ

2

Elasticsearch использует Lucene в своей основе для индексирования и хранения данных. Lucene использует постоянную структуру данных для хранения данных, и именно по этой причине невозможно изменить структуры данных для данных, которые уже хранятся в elasticsearch. Можно обновить документы новыми значениями, но не изменять структуру для всего индекса.

Если вы хотите изменить отображения, то есть структуру данных, вам необходимо создать новый индекс с новым сопоставлением и сохранить его там.

Это, конечно, не так просто, если elasticsearch является мастером данных. Для этого вам нужно создать новый индекс с новым сопоставлением и прочитать данные из старого индекса и поместить его в новый индекс. Вы можете сделать это, используя подход Scan and Scroll.

Если вы хотите сделать это прозрачно для приложения чтения из elasticsearch вы можете использовать псевдоним:

Сначала имя индекса data_v1 и псевдоним data:

data -> data_v1 

Затем вы создаете новый индекс: data_v2 с новым сопоставлением. Прочтите все данные от data_v1 и сохраните их в data_v2. Сделав это, изменить псевдоним точки к data_v2

data -> data_v2 

Для изменения псевдонимов вы можете использовать «удалить» и «добавить» функции:

POST /_aliases 
{ 
    "actions": [ 
     { "remove": { 
      "alias": "items", 
      "index": "items_v1" 
     }} 
    ] 
} 

POST /_aliases 
{ 
    "actions": [ 
     { "add": { 
      "alias": "items", 
      "index": "items_v2" 
     }} 
    ] 
} 
+1

Может сделать его более ясным, что это совершенно нормально для обновлять документы, но что _mappings_ нельзя изменить без переиндексации. –

+0

@paweloque: Итак, если я вношу изменения в logstash.conf, я могу сделать сопоставление через elasticsearch и, наконец, изменения будут отражены в kibana? – kaks

+0

@kaks Как выглядит ваш logstash.conf? Если вы измените его там, вам, вероятно, придется удалить индекс, установить новое сопоставление и затем переиндексировать данные. – paweloque

Смежные вопросы