Elasticsearch Logstash Mixing up field types: class org.elasticsearch.index.mapper.KeywordFieldMapper$KeywordFieldType != class org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType #38
Labels
ELK
Elasticsearch/Logstash/Kibana
最近因为老项目迁移,在从Mysql往Elasticseaerch里导数据( #8 )时,Logstash有一下关键报错内容:
事后回看,这个报错信息还是比较精准的,但是当时还是一脸懵逼。因为建索引时我们指定了XXX字段就是text
然后Logstash的关键配置如下
就是以上教科书式的标准配置,但是却一直在报错
经过一段时间的调查,我们终于找到了原因。究其根源,是因为Elasticsearch在6.X版本中,去掉了原来类似关系型数据库表的概念的
type
,这里需要稍微科普一下:在Elasticsearch 5.X中,index类似关系型数据库里面的database,一个index里面可以有多个type,这个type相当于关系型数据库里面的table。但是在实际的开发过程中,其实type是比较鸡肋的,就我个人而言,我是基本上没有用过的。因为没必要非要把不同的数据强行塞到一个index里面,再去通过type区分。实际工作中要么就是放到不同的index里面,要么也是通过自己的某个分类关键字去区分不同类型的数据,type长期处于默认值。问题恰恰就出在这个地方。在Elasticsearch 6.X中,官方也终于去掉了type。但是因为我们是在迁移项目(很不幸,从6.X到5.X,因为云厂商还没部署6.X),所以导致建索引时用的是5.X的方法(指定了type是doc),但是在Logstash中,type这个关键字,又恰好被我们用来区分不同的数据(旧版本是6.X),最终导致的问题就是:我们手动建索引的时候,相当于建了一个叫doc的表,但是从Logstash导数据时,却是往
business_type_001
(见上)这个不存在的表里灌数据,因为表不存在,所以Logstash非常智能的给我们创建了一个同名表,然后按照Elasticsearch的默认配置为每个字段都设计了keyword这样的类型,于是引发了上面所说的问题。The text was updated successfully, but these errors were encountered: