0x01 产生原因
产生的原因是:因为在ES中有两个index定义的字段类型不一致导致的。
例如:
log_2019.1.1
GET /log_2019.1.1/_mapping
{
"log_2019.1.1": {
"mappings": {
"type-1": {
"properties": {
"age": {
"type": "long" => 在log_2019.1.1type-1下的age映射为long
}
}
}
}
}
}
log_2019.1.2
GET /log_2019.1.2/_mapping
{
"log_2019.1.2": {
"mappings": {
"type-1": {
"properties": {
"age": {
"type": "string" => 在log_2019.1.2/type-1/age => 映射为string
}
}
}
}
}
}
这样在使用kibana进行展示时,使用log_*就会存在两个索引,但是age的类型不同。
0x02 如果找到冲突的字段
现在知道了产生的原因,但是es记录了大量的日志,我们如何知道日志的那些字段冲突了呢?
其实kibana已经为我们提供了这样的功能
首先,进入kibana的mangement ==> Index Patterns,选择有冲突的index。这是我们可以看到页面会有提示conflict
其次,在fields中按type类型进行排序,可以找到存在conflict的字段类型。
最后,点击这两条后面的这个这个按钮就可以进入详细信息的页面,这是就可以看到有哪些存在错误的index
0x03 怎么解决冲突
因为ES并不支持,mapping字段类型的修改,所以要修改类型的话,需要按如下步骤进行。
- 先新建一个新的index,保证是正确的字段类型。
- 将原来index的内容,复制到新的index中。
- 删除原来的index。
- 用旧的index名字替换新的index名字就行了。
有一点要说明一下,就是这个操作风险比较高,需要提前备份数据,并且小心操作。