前面我们介绍了mapping相关的属性,细心的朋友可能会发现,在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。
那是因为ES可以动态映射,添加文档的时候遇到没有的字段,可以动态的添加到mapping中,下面是一些默认的mapping方式。
数值 | 如果缺失在mapping中添加类型 |
---|---|
null | 空值不添加类型到mapping |
true、false | 添加一个boolean类型 |
浮点数 | 添加一个floating类型 |
整数 | 添加一个long类型 |
object | 添加一个object类型 |
array | 根据数组第一个元素决定类型 |
字符串 | 可能被映射为date、double、long、text、keyword类型 |
注意:
"mappings": {
"date_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy"],
"numeric_detection": true
}
如果觉得ES默认的mapping方式对于自己的业务来说还有优化空间,我们就可以自定义的动态mapping方式定制映射方式。
例如,对于integer类型的字段我就想精确查询,那么我们就可以把它的index设置为false,如果我们一个附近说明字符串不想参与评分,我们就可以把它的norms设置为false。
有的内容我们根本不想被搜索,那么我们就可以把它的enable设置会false,如果我们不想在一个status状态字段上排序和其它聚合操作我们就可以把doc_values设置为false。
接下来我们就来看一下添加动态mapping的3种方式。
根据字段类型匹配通过 match_mapping_type 属性来控制,当添加文档的时候,ES的JsonParser解析出来的类型是match_mapping_type指定的类型,就会使用对应的mapping。
{
"mappings": {
"dynamic_templates": [
{
"dt_name_one": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"dt_name_two": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
根据字段名称映射使用的是 match、unmatch、match_pattern 属性来控制。
{
"mappings": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long",
"enable": false
}
}
},
{
"longs_as_strings": {
"match_pattern": "regex",
"match": "^profit_\\d+$",
"mapping": {
"type": "long",
"index": false,
"norms": false,
"doc_values": false
}
}
}
]
}
}
按路径匹配使用的是 path_match、path_unmatch 属性来指定。
{
"mappings": {
"dynamic_templates": [
{
"dt_path_name": {
"path_unmatch": "user.*",
"path_match": "*.conceal",
"mapping": {
"type": "text",
"enable": false
}
}
}
]
}
}
添加动态索引有2种方式:
第一种就是为索引添加mapping的时候同时指定动态映射的mapping。
第二种就是在索引模板中指定。
前面我们已经看了在添加索引mapping的时候指定,下面我们就来看一下在设置索引模板的时候指定。
{
"order": 0, // 模板优先级,数字越大优先级越高
"index_patterns": ["test*,user*"], // 匹配该模板的索引名称正则
"settings": {}, // 索引设置
"mappings": {}, // 索引中各字段的映射定义
"aliases": {} // 索引的别名
}
如上所示,就是在索引模板中最常见的属性了:
order:当索引名称匹配到多个索引模板的时候,换选择order值大的
index_patterns:索引名称匹配表达式,例如,所用以名称以test开头的都可以匹配到test*
settings:索引配置
mappings:默认的mapping
{
"order": 1,
"index_patterns": [
"test*",
"user*"
],
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": false
},
"dynamic_templates": [
{
"string_as_keyword": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
],
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
},
"aliases": {
"alias_name": {
"filter": {
"term": {
"user": "tim"
}
},
"routing": "tim"
}
}
}
PUT /_template/template_name
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。