前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch索引模板与动态mapping模板(四)

Elasticsearch索引模板与动态mapping模板(四)

原创
作者头像
问道白发
修改2019-12-16 11:15:22
4.9K0
修改2019-12-16 11:15:22
举报
文章被收录于专栏:ES

一、动态mapping

前面我们介绍了mapping相关的属性,细心的朋友可能会发现,在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。

那是因为ES可以动态映射,添加文档的时候遇到没有的字段,可以动态的添加到mapping中,下面是一些默认的mapping方式。

数值

如果缺失在mapping中添加类型

null

空值不添加类型到mapping

true、false

添加一个boolean类型

浮点数

添加一个floating类型

整数

添加一个long类型

object

添加一个object类型

array

根据数组第一个元素决定类型

字符串

可能被映射为date、double、long、text、keyword类型

注意:

  1. 数字类型默认的是被映射为long而不是integer
  2. 字符串可以被映射为多种类型,主要看内容
  3. 我们可以自定义字符串映射为日期的格式
代码语言:txt
复制
"mappings": {
    "date_detection": true,
    "dynamic_date_formats": ["MM/dd/yyyy"],
    "numeric_detection": true
  }

二、自定义动态mapping

如果觉得ES默认的mapping方式对于自己的业务来说还有优化空间,我们就可以自定义的动态mapping方式定制映射方式。

例如,对于integer类型的字段我就想精确查询,那么我们就可以把它的index设置为false,如果我们一个附近说明字符串不想参与评分,我们就可以把它的norms设置为false。

有的内容我们根本不想被搜索,那么我们就可以把它的enable设置会false,如果我们不想在一个status状态字段上排序和其它聚合操作我们就可以把doc_values设置为false。

接下来我们就来看一下添加动态mapping的3种方式。

2.1 根据字段类型mapping

根据字段类型匹配通过 match_mapping_type 属性来控制,当添加文档的时候,ES的JsonParser解析出来的类型是match_mapping_type指定的类型,就会使用对应的mapping。

动态映射数据类型映射.png
动态映射数据类型映射.png
代码语言:txt
复制
{
    "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
                            }
                        }
                    }
                }
            }
        ]
    }
}

2.2 根据字段名称mapping

根据字段名称映射使用的是 match、unmatch、match_pattern 属性来控制。

动态映射名称映射.png
动态映射名称映射.png
代码语言:txt
复制
{
    "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
                    }
                }
            }
        ]
    }
}

2.3 根据字段路径mapping

按路径匹配使用的是 path_match、path_unmatch 属性来指定。

动态映射路径.png
动态映射路径.png
代码语言:txt
复制
{
    "mappings": {
        "dynamic_templates": [
            {
                "dt_path_name": {
                    "path_unmatch": "user.*",
                    "path_match": "*.conceal",
                    "mapping": {
                        "type": "text",
                        "enable": false
                    }
                }
            }
        ]
    }
}

三、动态mapping的添加方式

添加动态索引有2种方式:

第一种就是为索引添加mapping的时候同时指定动态映射的mapping。

第二种就是在索引模板中指定。

前面我们已经看了在添加索引mapping的时候指定,下面我们就来看一下在设置索引模板的时候指定。

四、索引模板

代码语言:txt
复制
{
  "order": 0,                            // 模板优先级,数字越大优先级越高
  "index_patterns": ["test*,user*"],     // 匹配该模板的索引名称正则
  "settings": {},                        // 索引设置
  "mappings": {},                        // 索引中各字段的映射定义
  "aliases": {}                          // 索引的别名
}

如上所示,就是在索引模板中最常见的属性了:

order:当索引名称匹配到多个索引模板的时候,换选择order值大的

index_patterns:索引名称匹配表达式,例如,所用以名称以test开头的都可以匹配到test*

settings:索引配置

mappings:默认的mapping

索引模板.png
索引模板.png
代码语言:txt
复制
{
    "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"
        }
    }
}
代码语言:txt
复制
PUT /_template/template_name

五、文档

动态mapping模板

索引模板

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、动态mapping
  • 二、自定义动态mapping
    • 2.1 根据字段类型mapping
      • 2.2 根据字段名称mapping
        • 2.3 根据字段路径mapping
        • 三、动态mapping的添加方式
        • 四、索引模板
        • 五、文档
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档