在Elasticsearch中更改类型和重新索引

时间:2017-02-06 17:56:23

标签: elasticsearch logstash kibana elastic-stack reindex

我最近使用redis 2.8.24,Elasticsearch 1.2.2从(logstash 1.4.1 / 1.4.2)升级了我的ELK堆栈(logstash 2.3.4使用redis 3.2.3,Elasticsearch 2.3.5和Kibana 4.5.4)和Kibana 3.1.1)。升级进行得很顺利,但升级后我有一些字段有冲突类型。此特定字段由logstash动态创建,因此Elasticsearch中没有整体映射。我花了相当多的时间搜索如何改变它。每篇在线文章都说我不能简单地改变现有数据的字段类型。我引用的许多文章都需要重新索引,但未能解释如何。以下是我更改类型和重新索引的确切步骤。

从需要更改字段类型的当前索引获取映射:

curl -XGET http://localhost:9200/logstash-2016.05.30/_mapping?pretty=1 > logstash-2016.05.30

编辑logstash-2016.05.30文件,删除文件中的第二行(索引名称)和第二行(花括号)。如果不这样做,将不会更新映射。我想如果您将索引名称编辑为新名称它会起作用,但我没有尝试过(我应该尝试过)。

编辑logstash-2016.05.30文件并更改类型(即long为string或string为long)。您可以使用类似字段使用的确切定义。

"http_status" : {
  "type" : "string",
  "norms" : {
    "enabled" : false
  },
  "fields" : {
    "raw" : {
      "type" : "string",
      "index" : "not_analyzed",
      "ignore_above" : 256
    }
  }
},

更改为:

"http_status" : {
  "type" : "long"
},

接下来创建新索引(追加_new或任何你想要的东西)

curl -XPUT  http://localhost:9200/logstash-2016.05.30_new -d @logstash-2016.05.30

仔细检查映射是否已正确创建

curl -XGET http://localhost:9200/logstash-2016.05.30_new/?pretty

使用以下内容重新编制索引:

curl -XPOST  http://localhost:9200/_reindex -d '{
"source": {
"index" : "logstash-2016.05.30"
},
"dest" : {
"index" : "logstash-2016.05.30_new"
}
}'

计算两个索引中的条目(应该相同)

curl -XGET http://localhost:9200/logstash-2016.05.30/_count
curl -XGET http://localhost:9200/logstash-2016.05.30_new/_count

一旦满意,重建索引就成功删除旧索引

curl -XDELETE http://localhost:9200/logstash-2016.05.30

创建别名,以便仍然可以使用旧索引名称

curl -XPOST  http://localhost:9200/_aliases -d '{
"actions": [
{ "add": {
"alias": "logstash-2016.05.30",
"index": "logstash-2016.05.30_new"
}}
]
}'

最后,导航到Kibana并选择设置和索引模式。单击重新加载图标以刷新字段列表。应删除所有冲突。

遗憾的是,这并不是一个真正的问题,除非你觉得这可以用另一种方式来做,否则这就是这样做的问题。

1 个答案:

答案 0 :(得分:0)

对于Elasticsearch 6,需要进行一些小的更改。否则,请严格按照所有说明进行操作。

要获取映射,请使用pretty=true而不是pretty=1

curl -XGET http://localhost:9200/logstash-2016.05.30/_mapping?pretty=true > logstash-2016.05.30

对于所有XPUT / XPOST请求,现在必须将内容类型设置为application / json。

curl -XPUT  http://localhost:9200/logstash-2016.05.30_new \
  -H 'Content-Type: application/json' -d @logstash-2016.05.30