当前位置:首页 > ES > 正文内容

elasticsearch中动态模板全解实战

phpmianshi1年前 (2019-07-26)ES14

动态模板


在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。

那是因为ES可以动态映射,添加文档的时候遇到没有的字段,可以动态的添加到mapping中

动态模板,英文名为Dynamic Templates,是根据Elasticsearch可识别的数据类型,结合字段名称,来动态设定字段类型的一种机制。

自动识别规则

首先es可以自动识别文档字段的类型,这样可以降低用户的使用成本。

es是依靠json文档的字段类型来实现自动识别字段类型的:

json类型 :es类型

null  : 忽略

boolean : boolean

浮点 : float

整数 :   long

object : object

array : 第一个非null值类型决定

string : 匹配为日志则是date类型(默认开启),匹配为数字的话自动为 float或long类型(默认关闭),否则为text类型,附带keyword子字段


自定义动态模板

1、 根据字段类型mapping

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

{
    "mappings": {
        "dynamic_templates": [
            {
                "name_one": {
                    "match_mapping_type": "long",
                    "mapping": {
                        "type": "integer"
                    }
                }
            },
            {
                "name_two": {
                    "match_mapping_type": "string",
                    "mapping": {
                        "type": "text",
                        "fields": {
                            "raw": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        ]
    }}

2、 根据字段名称mapping

根据字段名称映射使用的是 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
                    }
                }
            }
        ]
    }}

3、根据字段路径mapping

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

{
    "mappings": {
        "dynamic_templates": [
            {
                "path_name": {
                    "path_unmatch": "user.*",
                    "path_match": "*.conceal",
                    "mapping": {
                        "type": "text",
                        "enable": false
                    }
                }
            }
        ]
    }}

动态mapping的添加方式

添加动态索引有2种方式:
第一种就是为索引添加mapping的时候同时指定动态映射的mapping。
第二种就是在索引模板中指定。


下面我们就来看一下在设置索引模板的时候指定。


索引模板

索引模板,英文名为Index Template。它是一种机制,这种机制允许我们定义一种模板,这种模板当新索引创建时将被自动应用。模板包含settingsmapping,以及这个模板是否可被应用于新的索引。

索引模板有以下限制:

  1. 索引模板仅在一个索引新创建时才起作用,修改模板不会影响已创建的索引。

  2. 可以设定多个索引模板,这些索引模板的设置将被merge在一起。

  3. 可以通过对索引模板指定order的数值,来控制merge的过程。

模板定义可以如下:

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

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

模板优先级:

1.应用Elasticsearch默认的settingsmappings

2.应用 order 数值低的索引模板中的设置。

3.应用 order 数值高的索引模板中的设置

4.应用索引创建时,用户指定的settingsmappings

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

mappings:默认的mapping


# 创建一个默认模板,模板名为 template_default
# 这个模板匹配所有的索引,它的order属性值为0。索引创建时将被设置一个分片,一个副本。
PUT _template/template_default
{
  "index_patterns": ["*"],
  "order" : 0,
  "version": 1,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas":1
  }
}
 
# 创建一个模板,模板名为 template_test
# 这个模板匹配test开头的索引,它的order属性值为1。索引创建时将被设置一个分片,两个副本。
# 并且,date类型自动检测功能将关闭,数字自动检测功能将开启。
PUT /_template/template_test
{
    "index_patterns" : ["test*"],
    "order" : 1,
    "settings" : {
        "number_of_shards": 1,
        "number_of_replicas" : 2
    },
    "mappings" : {
        "date_detection": false,
        "numeric_detection": true
    }
}
 
# 删除模板名为template_1的模板
DELETE /_template/template_1
 
# 获取模板名为template_1的模板
GET /_template/template_1
 
# 获取通配符模板
GET /_template/temp*
 
# 获取多个模板
GET /_template/template_1,template_2
 
# 获取所有模板
GET /_template
 
# 判断模板是否存在
HEAD _template/template_1


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

elasticsearch中query和filter区别

区别在进行query的时候,除了完成匹配的过程,我们实际上在问“这个结果到底有多匹配我们的搜索关键词”。在所有的返回结果的后面都会有一个_score字段表示这个结果的匹配程度,也就是相关性。相关性越高...

es的基本概念和原理

基本概念和原理 ES其实就是基于lucene之上封装的一个分布式 索引框架,所以lucene拥有的特性,它都是有的,同时因为它使基于分布式的,所以对很多的功能进行了扩展,要想掌握ES,需要先熟悉一...

logstash过滤器--mutate

概念filters/mutate 插件是 Logstash 另一个重要插件。它提供了丰富的基础类型数据处理能力。包括类型转换,字符串处理和字段处理等。Plugin version: v3.5.0执行顺...

elasticsearch模糊查询match match_phrase wildcard regexp prefix的区别

1.match查询会先对搜索词进行分词,比如“白雪公主和苹果”,会分成“白雪”“公主”“苹果”。含有相关内容的字段,都会被检索出来。2.match_phrase查询match_phrase与slop一...

elasticsearch中重新索引数据

概念虽然你可以给索引添加新的类型,或给类型添加新的字段,但是你不能添加新的分析器或修改已有字段。假如你这样做,已被索引的数据会变得不正确而你的搜索也不会正常工作。 修改在已存在的数据最简单的...

kibana DevTools语句查询详解

直接点击Dev Tools,来看基本操作1,输入:GET /{   "name": "GddjX_V",  &nbs...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。