Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Elasticsearch Logstash Mixing up field types: class org.elasticsearch.index.mapper.KeywordFieldMapper$KeywordFieldType != class org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType #38

Open
Shellbye opened this issue Nov 23, 2018 · 0 comments
Labels
ELK Elasticsearch/Logstash/Kibana

Comments

@Shellbye
Copy link
Owner

Shellbye commented Nov 23, 2018

最近因为老项目迁移,在从Mysql往Elasticseaerch里导数据( #8 )时,Logstash有一下关键报错内容:

Mixing up field types: class org.elasticsearch.index.mapper.KeywordFieldMapper$KeywordFieldType != class org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType  on field XXX

事后回看,这个报错信息还是比较精准的,但是当时还是一脸懵逼。因为建索引时我们指定了XXX字段就是text

{
   "mappings":{
      "doc":{
         "properties":{
            "id":{
               "type":"keyword"
            },
            "XXX":{
               "type":"text"
            }
         }
      }
   }
}

然后Logstash的关键配置如下

input {
     jdbc {
        type => "business_type_001",
        statement => "select id, XXX from my_table"
    }
}

就是以上教科书式的标准配置,但是却一直在报错

Mixing up field types: class org.elasticsearch.index.mapper.KeywordFieldMapper$KeywordFieldType != class org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType  on field XXX

经过一段时间的调查,我们终于找到了原因。究其根源,是因为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这样的类型,于是引发了上面所说的问题。

@Shellbye Shellbye added the ELK Elasticsearch/Logstash/Kibana label Nov 23, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ELK Elasticsearch/Logstash/Kibana
Projects
None yet
Development

No branches or pull requests

1 participant