Elastic数据类型转换记录

Elastic Fields type转换(string到number)

Posted by Mr.Zhou on September 28, 2018

背景

ELK接Nginx日志需求,日志已成功接入,但Kibana上显示sc_bytes字段为string,无法进行聚合操作,无法为该字段配置曲线图。

问题

查看logstash的grok规则,单独为其配置转换规则后,重启服务后仍然无效:

  mutate {
    convert => ["sc_bytes", "float"]
  }

查看索引的数据结构,发现非string,也非float,而是什么keyword字段类型:

# curl -s http://<es_ip>:9200/logstash-kafka-evops-2018.09.28
...
    "sc_bytes": {
        "type": "text",
        "norms": false,
        "fields": {
            "raw": {
                "type": "keyword",
                "ignore_above": 256
            }
        }
    },
...

然而,查看了ES官网文档后,2.x之后版本不支持keyword类型,会自动降级至string类型,从而造成了我们再Kibana上看到sc_bytes字段为string

Indexes imported from 2.x do not support keyword. Instead they will attempt to downgrade keyword into string.

缓解

让ES自动识别成number类型失败,我们通过初始化索引模板的方式来解决这个问题。

我们通过cerebro这个小工具来进行配置:

# Section
index templates

# Template name
template-evops-nginx

# Template content
{
  "order": 1,
  "template": "logstash-kafka-evops-*",
  "settings": {
    "index": {
      "number_of_shards": "2",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "_default_": {
      "properties": {
        "sc_bytes": {
          "type": "double"
        }
      }
    }
  },
  "aliases": {}
}

删除老索引,新索引自动创建后,字段类型转换完成:

# curl -XDELETE http://<es_ip>:9200/logstash-kafka-evops-2018.09.28

# curl -s http://<es_ip>:9200/logstash-kafka-evops-2018.09.28
...
    "sc_bytes": {
        "type": "double"
    },
...

后记

这个已经是老问题了,这两天接到新接入需求,又遇到这个问题,顺便在这边记录下。