动态映射
ES中提供了一种叫做映射的机制,可以自动或手动为index中的文档建立一种数据结构和相关配置。
在自动建立映射的时候,我们可以通过创建映射的模版或更改设置,以达到我们想要的结果。
定制动态映射策略
dynamic 字段
ES中dynamic
提供了三个参数:
- true:遇到陌生字段进行动态映射。
- false:新检测到的字段将被忽略。这些字段将不会被索引,因此将无法搜索,但仍将出现在返回的源字段中。意思就是说返回的字段里有,但是搜索的话无法搜索到。
- strict:遇到陌生字段进行报错。
例如:
PUT /my_index
{
"mappings": {
//true false strict
"dynamic": "strict",
"properties": {
"title": {
"type": "text"
},
"address": {
"type": "object",
"dynamic": "true"
}
}
}
}
日期探测(date_detection)
在ES中,自动映射会将像yyyy-MM-dd
格式映射为date
类型,在某些情况下,当我们把目标的text
类型映射为date
类型,之后会有很大的麻烦。
ES中有一种叫做日期探测的字段,关闭日期探测即可以避免此情况的发生。
PUT /my_index
{
"mappings": {
//false即关闭日期探测
"date_detection": false,
"properties": {
"title": {
"type": "text"
},
"address": {
"type": "object",
"dynamic": "true"
}
}
}
}
数字探测(numeric_detection)
虽然JSON支持本机浮点和整数数据类型,但某些应用程序或语言有时可能将数字呈现为字符串。通常正确的解决方案是显式地映射这些字段,可以启用数字检测(默认情况下禁用)来自动完成这些操作。
PUT my_index
{
"mappings": {
//默认为false。true表示开启,即可识别字符串中为数字的字段
"numeric_detection": true
}
}
自定义动态模版
模版例子:
PUT /my_index
{
"mappings": {
//dynamic_templates 动态模版字段 固定写法
"dynamic_templates": [{
//策略名 自己定义
"en": {
//当字段以en结尾就会匹配到执行此策略
"match": "*_en",
//匹配的属性值是否为string类型
"match_mapping_type": "string",
"mapping": {
//当满足以上类型:字段en结尾 是string类型 会映射成以下定义类型
// 定义为text类型
"type": "text",
//分词器为英文分词器
"analyzer": "english"
}
}
},
//long类型映射策略
"long_match": {
//匹配的属性值是否为long类型
"match_mapping_type": "long",
//映射为integer类型
"mapping": {
"type": "long"
}
]
}
}
参数:
- match
"match": "*_en"
:以en结尾的都会被匹配到。 - unmatch
"unmatch": "en_*"
:以en开头的都不会被匹配到。 - match_mapping_type
"match_mapping_type": "string"
:匹配到的类型是否为string
类型。 - path_match
"path_match": "com.*"
:以com
开头的路径形式的字段都会被匹配到。 - path_unmatch
"path_unmatch": "*.cn"
:以cn
结尾的路径形式的字段都不会被匹配到。 - match_pattern
使用正则的格式进行匹配:
"match_pattern": "regex",
"match": "^profit_\d+$"