美文网首页
Elasticsearch学习笔记(12) - 索引模板和动态模

Elasticsearch学习笔记(12) - 索引模板和动态模

作者: juconcurrent | 来源:发表于2019-08-03 00:07 被阅读0次

    本章,我们将简单介绍索引模板和动态模板的内容。其实,在前面章节,我们已经粗略地用到了动态模板,但是没有明确提出这样的概念。

    索引模板

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

    索引模板有以下限制:

    1. 索引模板仅在一个索引新创建时才起作用,修改模板不会影响已创建的索引。
    2. 可以设定多个索引模板,这些索引模板的设置将被merge在一起。
    3. 可以通过对索引模板指定order的数值,来控制merge的过程。

    接下来,我们创建两个模板。

    # 创建一个默认模板,模板名为 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
    

    索引模板起作用的时机在于新索引创建的时候。其工作方式将按照下面的顺序执行,并且会逐级覆盖。例如:order数值高的将覆盖order数值低的。

    1. 应用Elasticsearch默认的settingsmappings
    2. 应用 order 数值低的索引模板中的设置。
    3. 应用 order 数值高的索引模板中的设置
    4. 应用索引创建时,用户指定的settingsmappings

    动态模板

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

    而Elasticsearch自带了动态字段映射,它的规则如下所示。

    动态字段映射

    通过动态模板这种机制,我们可以达到类似下面的效果:

    1. 所有的字符串类型都设定成 keyword,或者关闭keyword字段。
    2. is开头的字段都设置成boolean类型。
    3. long_开头的字段都设置成long类型。

    它的语法如下所示:

    动态模板的语法

    这种语法包含以下内容:

    1. 动态模板是定义在某个具体索引的mappings中
    2. 动态模板需要指定一个名称,例如上图的my_template_name
    3. 匹配规则是一个数组
    4. 为匹配到的字段设置mapping

    1. 例子1

    DELETE my_index
    # 简单的例子
    PUT my_index
    {
      "mappings": {
        "dynamic_templates": [
          {
            "strings_as_boolean": {
              "match_mapping_type":   "string",
              "match":"is*",
              "mapping": {
                "type": "boolean"
              }
            }
          },
          {
            "strings_as_keywords": {
              "match_mapping_type":   "string",
              "mapping": {
                "type": "keyword"
              }
            }
          }
        ]
      }
    }
    PUT my_index/_doc/1
    {
      "firstName":"Ruan",
      "isVIP":"true"
    }
    GET my_index/_mapping
    

    在这个例子中,我们设置了两个动态模板。

    1. 根据strings_as_boolean的动态模板定义,如果字段类型为字符串类型,且字段名以is开头,其字段类型将映射成boolean类型。
    2. 根据strings_as_keywords的动态模板定义,如果字段类型为字符串类型,其字段类型将映射成keyword类型。

    2. 例子2

    DELETE my_index
    # 路径的例子
    PUT my_index
    {
      "mappings": {
        "dynamic_templates": [
          {
            "full_name": {
              "path_match":   "name.*",
              "path_unmatch": "*.middle",
              "mapping": {
                "type":       "text",
                "copy_to":    "full_name"
              }
            }
          }
        ]
      }
    }
    
    
    PUT my_index/_doc/1
    {
      "name": {
        "first":  "John",
        "middle": "Winston",
        "last":   "Lennon"
      }
    }
    
    GET my_index/_search?q=full_name:John
    

    在这个例子中,我们定义了一个动态模板,名字叫full_name。它会匹配路径,路径以name开头,且不以middle结尾的字段,将被映射成一个text,且拷贝到full_name这个字段中。

    总结

    我们了解了索引模板和动态模板各自的作用,也举了一些实际的例子来加深我们的印象。但是,更全面的内容还需要看Elasticsearch的官网。

    参考链接

    相关文章

      网友评论

          本文标题:Elasticsearch学习笔记(12) - 索引模板和动态模

          本文链接:https://www.haomeiwen.com/subject/bfkddctx.html