高级的用法
动态mapping
比如说,我们本来没有某个type,或者没有某个field,但是希望在插入数据的时候,es自动为我们做一个识别,动态映射出这个type的mapping,包括每个field的数据类型,一般用的动态映射,dynamic mapping
自定义动态映射模板
这里有个问题,如果说,我们其实对dynamic mapping有一些自己独特的需求,比如说,es默认来说,如经过识别到一个数字,field: 10,默认是搞成这个field的数据类型是long,再比如说,如果我们弄了一个field : "10",默认就是text,还会带一个keyword的内置field。我们没法改变。
但是我们现在就是希望动态映射的时候,根据我们的需求去映射,而不是让es自己按照默认的规则去玩儿
dyanmic mapping template,动态映射模板
我们自己预先定义一个模板,然后插入数据的时候,相关的field,如果能够根据我们预先定义的规则,匹配上某个我们预定义的模板,那么就会根据我们的模板来进行mapping,决定这个Field的数据类型
0、默认的动态映射的效果咋样
删除原先的index
DELETE /my_index
插入数据
PUT /my_index/my_type/1 { "test_string": "hello world", "test_number": 10 }
|
es的自动的默认的,动态映射是咋样的。。。
查看es自动创建的默认映射
GET /my_index/_mapping/my_type 结果: { "my_index": { "mappings": { "my_type": { "properties": { "test_number": { "type": "long" }, "test_string": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
|
这个就是es的默认的动态映射规则,可能就不是我们想要的。。。
我们比如说,现在想要的效果是啥。。。
test_number,如果是个数字,我们希望默认就是integer类型的
test_string,如果是字符串,我们希望默认是个text,这个没问题,但是内置的field名字,叫做raw,不叫座keyword,类型还是keyword,保留500个字符
1、根据类型匹配映射模板
动态映射模板,有两种方式,第一种,是根据新加入的field的默认的数据类型,来进行匹配,匹配上某个预定义的模板;第二种,是根据新加入的field的名字,去匹配预定义的名字,或者去匹配一个预定义的通配符,然后匹配上某个预定义的模板
创建自定义模板
PUT my_index { "mappings": { "my_type": {//type 类型 "dynamic_templates": [ { "integers": {//自定义类型 "match_mapping_type": "long",//匹配的类型名称 "mapping": { "type": "integer"//转换成的类型 } } }, { "strings": { "match_mapping_type": "string", "mapping": { "type": "text", "fields": { "raw": {//内属性 "type": "keyword", "ignore_above": 500 } } } } } ] } } }
|
插入测试数据
PUT /my_index/my_type/1 { "test_long": 1, "test_string": "hello world" }
|
查看mappings
GET /my_index/_mapping/my_type 结果: { "my_index": { "mappings": { "my_type": { "dynamic_templates": [ { "integers": { "match_mapping_type": "long", "mapping": { "type": "integer" } } }, { "strings": { "match_mapping_type": "string", "mapping": { "fields": { "raw": { "ignore_above": 500, "type": "keyword" } }, "type": "text" } } } ], "properties": { "test_number": { "type": "integer" }, "test_string": { "type": "text", "fields": { "raw": { "type": "keyword", "ignore_above": 500 } } } } } } } |
2、根据字段名配映射模板
创建自定义模板
PUT /my_index { "mappings": { "my_type": { "dynamic_templates": [ { "string_as_integer": { "match_mapping_type": "string",//匹配到string类型 "match": "long_*",//匹配到以long开头 "unmatch": "*_text",//匹配到不以text结尾的 "mapping": { "type": "integer" } } } ] } } }
|
插入测试数据
PUT /my_index/my_type/1 { "test_long": 1, "test_string": "hello world" }
|
查看mappings
GET /my_index/_mapping/my_type 结果: { "my_index": { "mappings": { "my_type": { "dynamic_templates": [ { "string_as_integer": { "match": "long_*", "unmatch": "*_text", "match_mapping_type": "string", "mapping": { "type": "integer" } } } ], "properties": { "long_field": { "type": "integer" }, "long_field_text": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } }
|
举个例子,field : "10",把类似这种field,弄成long型
场景,有些时候,dynamic mapping + template,每天有一堆日志,每天有一堆数据
这些数据,每天的数据都放一个新的type中,每天的数据都会哗哗的往新的tye中写入,此时你就可以定义一个模板,搞一个脚本,每天都预先生成一个新type的模板,里面讲你的各个Field都匹配到一个你预定义的模板中去,就好了