zoukankan      html  css  js  c++  java
  • Elasticsearch核心技术(三):Mapping设置

    Mapping是Elasticsearch中数据建模的基础,本文从Mapping简介、Dynamic Mapping、自定义Mapping和Mapping常用参数说明4个部分介绍Elasticsearch如何设置Mapping。

    3.1 Mapping简介

    3.1.1 什么是Mapping

    Mapping类似数据库中的表定义,主要作用如下:

    1. 定义索引下的字段名
    2. 定义字段的类型,比如数值型、字符串型、布尔型等
    3. 定义倒排索引相关的配置,比如是否索引、记录position等

    使用API获取Mapping:
    request:GET /test_index/_mapping
    response:

    {
      "test_index" : {
        "mappings" : {
          "properties" : {
            "age" : {
              "type" : "long"
            },
    
            "username" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
    

    3.1.2 Mapping支持的数据类型

    • 核心数据类型
      • 字符串型:text、keyword
      • 数值型:long、integer、short、byte、double、float、half_float、scaled_float
      • 日期类型:date
      • 布尔类型:boolean
      • 二进制类型:binary
      • 范围类型:integer_range、float_range、long_range、double_range、data_range
    • 复杂类型
      • 数组类型:array
      • 对象类型:object
      • 嵌套类型:nested object
    • 特殊类型
      • 地理位置:geo_point、geo_shape、
      • IP地址:IPv4、IPv6
      • 自动补全:complete
      • percolator
    • 多字段特性:multi-fields
      • 允许对同一字段采用不同的配置,比如分词,常见例子如对人名实现拼音搜索
      • 实现方式:在人名中新增一个子字段为pinyin即可

    3.2 Dynamic Mapping

    3.2.1 什么是Dynamic Mapping

    • 在文档写入的时候,如果索引不存在,会自动创建索引
    • Dynamic Mapping的机制,使得无需手动定义Mapping,Elasticsearch会自动识别字段的类型,从而降低用户的使用成本
    • 但是有时候会推算的不对,例如地址位置信息
    • 当类型如果设置不对时,会导致一些功能无法正常使用,例如Range查询

    3.2.2 类型的自动识别

    ES依靠JSON文档的字段类型来实现自动识别字段类型,支持的类型如下:

    JSON类型 ES类型
    null 忽略
    boolean boolean
    浮点类型 float
    整数 long
    object object
    array 由第一个非null值的类型决定
    string 匹配日期格式,设置为Date(默认开启);匹配数字,设置为float或者long(默认关闭);设置为Text,并且增加keyword子字段

    3.2.3 Dynamic的设置

    当创建Index的时候,dynamic字段可以设置成3种值:true、false、strict。

    例如:

    PUT movies
    {
        "mapping":{
            "_doc":{
                "dynamic":"false"
            }
        }
    }
    
    true false strict
    文档可索引
    字段可索引
    Mapping被更新

    说明:

    • 当设置成true的时候,文档可以被索引,字段可以被搜索,Mapping文件可以更新。
    • 当dynamic被设置成false的时候,新增字段的数据可以写入ES;该数据可以被索引,但是新增字段不可被搜索。
    • 当设置成strict的时候,数据写入直接报错。

    3.3 自定义Mapping

    3.3.1如何自定义Mapping

    自定义Mapping的一些建议

    • 可以参考API手册,纯手写
    • 为了减少工作量,减少出错率,可以参考以下步骤:
      1. 创建一个临时的index,写入一些样本数据
      2. 通过访问Mapping API获得该临时文本的动态Mapping定义
      3. 修改后,使用该配置创建索引
      4. 删除临时索引

    3.3.2 能否更改Mapping的字段类型

    ES能否更改Mapping的字段类型,需要分两种情况进行分析。

    1. 新增字段
    dynamic设置为true(默认值)时,一旦有新增字段的文档写入,Mapping也同时被更新。
    dynamic设置为false时,Mapping不会被更新,更新字段的数据无法被索引,但是信息会出现在_source中,换言之,文档可以正常写入,但是无法对字段进行搜索。
    dynamic设置为strict时,文档写入失败。

    2. 对已有字段,一旦已经有数据写入,就不再支持修改字段定义。因为ES是基于Lucene实现的倒排索引,一旦生成后,就不允许修改。因为如果修改了字段的数据类型,会导致已被索引的数据无法被搜索。如果希望修改字段类型,必须使用Reindex API进行重建索引。

    3.4 Mapping常用参数说明

    • copy_to
      将该字段复制到目标字段,实现类似_all的作用;不会出现在_source中,只用来搜索

    • index
      控制当前字段是否索引,默认为true,即记录索引,false不记录,即不可搜索。

      例如某些场景希望敏感信息不用来做搜索,可以将index设置为false,则不可以用来搜索,也可以节省空间。

      index_option用于控制倒排索引记录的内容,有4种配置:

      1. docs只记录doc id
      2. freqs记录doc id和term frequencies
      3. positions记录doc id、term frequencies和term position
      4. offsets记录doc id、term frequencies、term position和character offsets
        text类型默认配置为positions。其他默认是docs。当然记录内容越多,占用空间越大。
    • null_value
      当字段遇到null值时的处理策略,默认为null,即空值,此时es会忽略该值;可以通过设定该属性设定字段的默认值。

    更多常用参数可以参考:https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html

    由于博主也是在攀登的路上,文中可能存在不当之处,欢迎各位多指教! 如果文章对您有用,那么请点个”推荐“,以资鼓励!
  • 相关阅读:
    初识数据库
    局域网和广域网
    面试题汇总
    SSO单点登录解决方案
    接口加密问题
    幂等性问题
    消息队列的消费失败、重复消费问题
    Redis集群搭建
    HashCode详解
    HashMap的底层原理
  • 原文地址:https://www.cnblogs.com/sgh1023/p/15473995.html
Copyright © 2011-2022 走看看