ELK系列之如何改变ES之前数据的类型
1、前言
公司有一个部门近期修改了ES的索引模板,我们运维部门在修改的时候有一个字段mid没有指定类型,使用默认的类型,结果导致之前的查询不可用了,查询报错;
报错信息如下:
3 of 76 shards failed
2、查询问题
开始也是没有头脑,无从下手,然后就去问度娘,也是无果;最后我重新拆分查询条件,发现有个字段mid有问题,此时我查看此时段的索引信息,发现mid使用的是默认类型,才恍然大悟;
### 查询索引模板
GET /_template/logstash_jump
### 查询指定索引的模板信息
GET /logstash_jump_mrwso_2020_03_14/_mapping
3、处理问题
我重新修改ES的索引模板信息如下:
PUT /_template/logstash_jump
{
"index_patterns" : ["logstash_jump*"],
"order" : 1,
"settings" : {
"number_of_shards": 4,
"number_of_replicas" : 1
},
"mappings" : {
"properties" : {
"visitip" : {
"type" : "keyword"
},
"visittime" : {
"format" : "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd",
"type" : "date"
},
"visit_time_str" : {
"type" : "keyword"
},
"urltype" : {
"type" : "keyword"
},
"code" : {
"type" : "keyword"
},
"request_type" : {
"type" : "keyword"
},
"city" : {
"type" : "keyword"
},
"visit_type" : {
"type" : "keyword"
},
"remark" : {
"type" : "keyword"
},
"sys" : {
"type" : "keyword"
},
"type" : {
"type" : "keyword"
},
"ua" : {
"type" : "keyword"
},
"imp_id" : {
"type" : "keyword"
},
"brower" : {
"type" : "keyword"
},
"apk_diversion" : {
"type" : "keyword"
},
"province" : {
"type" : "keyword"
},
"server_ip" : {
"type" : "keyword"
},
"iframe_type" : {
"type" : "keyword"
},
"serverip" : {
"type" : "keyword"
},
"from" : {
"type" : "keyword"
},
"mid" : {
"type" : "keyword"
},
"sem_source" : {
"type" : "keyword"
},
"types" : {
"type" : "keyword"
},
"visit_time" : {
"type" : "keyword"
},
"ad_response" : {
"type" : "keyword"
},
"ad_form" : {
"type" : "keyword"
},
"cookie_id" : {
"type" : "keyword"
},
"url" : {
"type" : "keyword"
},
"visit_ip" : {
"type" : "keyword"
},
"dwzDiversion_rule_config_json" : {
"type" : "keyword"
},
"province_id" : {
"type" : "keyword"
},
"refer" : {
"type" : "keyword"
},
"device_brand" : {
"type" : "keyword"
},
"global_log_id" : {
"type" : "keyword"
},
"domain" : {
"type" : "keyword"
},
"longurl" : {
"type" : "keyword"
},
"member_type" : {
"type" : "keyword"
},
"request_id" : {
"type" : "keyword"
},
"desc" : {
"type" : "keyword"
}
}
},
"aliases" : { }
}
3、处理异常数据
ES创建好了mapping后是不允许修改字段类型的,要是我们想修改字段类型怎么办呢?
我们可以采用reindex的方法实现,就是创建一个新的mapping,里面的字段类型按照新的类型定义,然后使用reindex的方法把原来的数据拷贝到新的index下面;
[root@VM_185_109_centos ~]# curl -X POST "127.0.0.1:9200/_reindex" -H 'Content-Type: application/json' -d'
> {
> "source": {
> "index": "logstash_jump_suoim_2020_03_12"
> },
> "dest": {
> "index": "logstash_jump_suoim_2020_02_12"
> }
> }'
说明:此时查询logstash_jump_suoim_2020_02_12的mid数据类型就正常了;
4、总结
我们在处理突发问题的时候有可能一时间无从下手,但是我们一定要进行下去,一定要开头,万事开头难,当我们开头处理的时候就会有可能柳暗花明,处理问题的过程中,我们有可能查询到原因。
实话:这个偏文档解决了如何创建ES的索引模板,如何迁移索引数据、如何改变数据的类型。