一步一步学习Elasticsearch03-映射与动态模板

本文基于Elasticsearch6.x,本文大纲

  • mapping常见属性
  • 动态映射dynamic-mapping
  • 动态模板
  • 索引模板

ES之Mapping

mapping类似于数据库中的scheme,主要作用如下

  • 定义Index下的字段名
  • 定义字段的类型
  • 定义倒排索引的相关配置(是否索引、记录position等)

获取指定索引的mapping

GET test_index/_mapping

通常Mapping中的字段类型一旦设定,则禁止直接修改,因为Lucene实现的倒排索引生成后不允许修改,可以通过reindex操作重新建立新的倒排索引

es允许新增字段,通过dynamic参数来进行控制

  • true:允许新增字段(默认)
  • false:不允许新增字段,但文档可以正常写入,无法对字段进行查询等操作
  • strict:不能写入,如果有新字段写入则报错

mapping常见属性

  • copy_to

    • 将字段值复制到目标字段,类似于_all作用
    • 不会出现在_source中,只能用来检索
    • 相当于把已有的多个字段组合成一个新字段,然后可以使用这个新字段进行检索,相当于对多个字段进行同时检索
    PUT my_index
    {
        "mappings":{
            "doc":{
                "properties":{
                    "first_name":{
                        "type":"text",
                        "copy_to":"full_name"
                    },
                    "last_name":{
                        "type":"text",
                        "copy_to":"full_name"
                    },
                    "full_name":{
                        "type":"text"
                    }
                }
            }
        }
    }
    
    PUT my_index/doc/1
    {
      "first_name":"zhang",
      "last_name":"lisi"
    }
    
    GET my_index/_search
    {
      "query": {"match_all": {}}
    }
    
    返回结果
    {
            "_index": "my_index",
            "_type": "doc",
            "_id": "1",
            "_score": 1,
            "_source": {
              "first_name": "zhang",
              "last_name": "lisi"
            }
    
  • index_options:用来倒排索引记录的内容,有以下4个取值

    • docs:只记录doc_id
    • freqs:记录doc_id和term frequencis
    • positions·:记录doc_id、term frequencis和term position
    • offsets: doc_id、term frequencis、term position和offset

    text类型默认配置为positions,其他默认为docs,记录的内容越多,占用空间越大

  • null_value

    当字段遇到null值时的处理策略,默认为null,即空值,es会忽略该值,可以设定默认值

  • doc_values

    • 关于倒排索引的深入理解
    • 注意,text默认不支持doc_values
    • 简而言之,倒排索引构建了词条到文档列表的映射,使得检索非常快,但对于排序和聚合来讲,却不是这样,它需要我们找到文档及文档对应的词条。
    • doc_values在文档index时以面向列的形式构建,这使得他对排序和聚合非常有效,doc_values支持几乎所有的字段类型,并且默认启用,如果你不需要对某个字段进行排序、聚合或者从脚本(script)中访问该字段,可禁用以节省空间
  • fielddata

    text类型不支持doc_values属性,因此无法对text类型进行聚合、排序、脚本取值等操作,可以使用fielddata属性设置。

    fielddata属性采用延时加载的策略,当首次需要排序、聚合及脚本取值时才进行构建,读取整个倒排索引,抓换词条--文档之间的关系,将结果在内存中排序,一旦构建,将会一直保留在内存中,加载fielddata是非常消耗内存的,因此默认是关闭的

    通常来讲,对text类型进行聚合、排序以及脚本取值是没有意义的,我们应该避免,可以通过再设置一个keyword类型的字段进行保存,而不是设置fielddata=true

    可以通过设置fielddata_frequency_filter来减少加载进内存的词条数量,从而减少内存占用

  • enabled

    默认是true。只用于mapping中的object字段类型。当设置为false时,其作用是使es不去解析该字段,并且该字段不能被查询和store,只有在_source中才能看到(即查询结果中会显示的_source数据)。设置enabled为false,可以不设置字段类型,默认为object

  • index

    • index用于记录当前字段是否索引,默认为true,fasle不进行倒排索引的构建,则不可进行搜索
    • 可以用于记录一些不需要查询或者不想让查询的字段,比如身份证号等敏感信息
    • 默认是true。当设置为false,表明该字段不能被查询,如果查询会报错。但是可以被store。当该文档被查出来时,在_source中也会显示出该字段。
  • store

    默认false。store参数的功能和_source有一些相似。我们的数据默认都会在_source中存在。但我们也可以将数据store起来,不过大部分时候这个功能都很鸡肋。不过有一个例外,当我们使用copy_to参数时,copy_to的目标字段并不会在_source中存储,此时store就派上用场了。

    index、enable、store三者能否同时存在:
    首先设置了enabled为false就不能设置store为true了,这两者冲突。而index和store是不冲突的。最后index和enabled之间的问题:enabled需要字段类型为object,而当字段类型为object时,好像不能设置index参数,试了几次都会报错。

  • format

    用于对日期格式的数据进行格式化

  • ignore_above

    不会对超过指定长度的字符串构建索引以及store,如果是数组,将会应用到数组中的每一个元素上。这些字符换或者数组元素仍然会在_source中显示。

通常来讲,是对keyword类型使用,而不能对text字段使用

当对该字段进行聚合时,其值不参与聚合

可以通过PUT mapping API更新取值,因此,相同索引的同一字段可以有不同的取值

  • ignore_malformed

    可以忽略类型错误,同时设置为true时该字段不会被索引。默认为false,当存入错误类型的数据时会报错

  • fields

    常用与对一个字段进行不同方式的处理,用以实现多字段特性

PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "keyword": { 
              "type":  "keyword"
            }
          }
        }
      }
    }
  }
}
  • norms

    norms用于计算相关性得分,但会消耗较多的磁盘空间。如果不需要对某个字段进行评分,最好不要开启norms。

  • properties

    当数据类型为object或者nested,有子节点的时候,可以使用properties来进行定义

PUT my_index
{
  "mappings": {
    "_doc": { 
      "properties": {
        "manager": { 
          "properties": {
            "age":  { "type": "integer" },
            "name": { "type": "text"  }
          }
        },
        "employees": { 
          "type": "nested",
          "properties": {
            "age":  { "type": "integer" },
            "name": { "type": "text"  }
          }
        }
      }
    }
  }
}

​ 当对内部字段进行查询或聚合事,可以使用点语法

GET my_index/_search
{
  "query": {
    "match": {
      "manager.name": "Alice White"
    }
  },
  "aggs": {
    "Employees": {
      "nested": {
        "path": "employees"
      },
      "aggs": {
        "Employee Ages": {
          "histogram": {
            "field": "employees.age",
            "interval": 5
          }
        }
      }
    }
  }
}
  • normalizer

    normalizer是keyword的属性,其作用类似于analyzer,在index和search之前进行处理(跟analyzer三个组件一样)

  • boost

    用于增加指定字段检索时的权重,只对term queries有效,对prefix, range and fuzzy queries等无效。

  • coerce

    当有一些脏数据时,可以对字段进行类型转换,比如将5,"5"转为5.0以符合字段类型的要求

动态映射(Dynamic Mapping)

  • es能够自动识别字符串里的日期类型,默认是 strict_date_optional_time
  • 可以通过dynamic_date_formats自定义日期类型
  • date_detection可以关闭日期自动识别机制
  • 可以通过numeric_detection来设置是否开启字符串中数字的自动识别

动态模板

允许根据es自动识别的数据类型、字段名等动态设定字段类型,可以实现如下效果

  • 所有字符串类型都设定为keyword类型
  • 所有以message开头的字段都设为text类型
  • 所有识别为double类型的字段都设定为float类型,以节省空间
一步一步学习Elasticsearch03-映射与动态模板_第1张图片
image

匹配规则一般有如下几个参数

  • match_mapping_type:匹配es自动识别的字段类型,如boolean、long、string等
  • match,unmatch:匹配字段名
  • path_match、path_unmatch匹配路径(对object类型)

索引模板(Index Template)

主要用于在新建索引时自动应用预先设定的配置,简化索引创建的操作步骤

  • 可以设定索引的配置和mapping
  • 可以有多个模板,根据order设置,order大的会覆盖小的
PUT _template/ug_push_other_log_template
{
  "index_patterns" : [
      "ug_error_log*",
      "ug_info_log*"
    ],
    "order" : 0,
    "settings" : {
      "number_of_shards" : "3",
      "number_of_replicas": "1"
    },
    "mappings" : {
        "doc" : {
          "dynamic":false,
            "properties": {
                "@timestamp": {
                    "type": "date"
                },
                "message": {
                "type": "keyword",
                "index":false
              },
                "type": {
                    "type":"keyword"
                },
                "ts": {
                "type": "keyword",
                "index":false
              }
            }
        }
    }
}

查看与删除索引模板

GET _template
GET _template/test_template
DELETE _template/test_template

你可能感兴趣的:(一步一步学习Elasticsearch03-映射与动态模板)