为什么elasticsearch不允许更改索引数据?

时间:2015-11-19 12:47:02

标签: elasticsearch logstash kibana

我尝试将之前索引的数据中的某些字段从字符串转换为整数。但是当我再次运行logstash时,字段没有转换(仅在Kibana中检查)。为什么我不能对已经编入索引的数据进行更改,如果没有,我如何对索引进行必要的更改?

我只是在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"}
        }
}

1 个答案:

答案 0 :(得分:2)

Elasticsearch使用Lucene作为索引和存储数据的核心。 Lucene使用只读数据结构来存储数据,这就是为什么无法更改已存储在elasticsearch中的数据的数据结构的原因。可以使用新值更新文档,但不能更改整个索引的结构。

如果要更改映射,即数据结构,则必须使用新映射创建新索引并将其存储在那里。

如果elasticsearch是数据的主人,那当然不是那么容易。为此,您必须使用新映射创建新索引并从旧索引读取数据并将其放入新索引中。您可以使用Scan and Scroll方法执行此操作。

如果您希望对从elasticsearch读取的应用程序透明,可以使用别名:

首先,索引名称为IgnoreChanges,别名为data_v1

data

然后使用新映射创建一个新索引:data -> data_v1 。阅读data_v2中的所有数据并将其存储在data_v1中。完成此操作后,将别名更改为指向data_v2

data_v2

要更改别名,您可以使用&#39;删除&#39;并且&#39;添加&#39;功能:

data -> data_v2