elasticsearch 基本概念-映射-mapping和类型

为了能够将时间域视为时间,数字域视为数字,字符串域视为全文或精确值字符串, Elasticsearch 需要知道每个域中数据的类型。这个信息包含在映射中。
映射, 就像数据库中的 schema ,描述了文档可能具有的字段或 属性 、每个字段的数据类型—比如 string, integer 或 date —以及Lucene是如何索引和存储这些字段的。

映射长什么样

PUT m1
{
  "mappings": {
    "dynamic": x,#这里写个x
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "long"
      }
    }
  }
}

  #增加新文档
    PUT /m1/_doc/1
    {
      "name": "jaychow",
      "age": 23,
      "sex": "男"
    }

映射类别

  • 静态映射:dynamic:false
  • 动态映射:dynamic: true
  • 严格模式:dynamic: strict

    静态映射

    静态映射就是像MySQL一样在创建表的时候对各个字段的属性进行设置
    当dynamic等于false文档新增时,会忽略该字段,但是仍会存储该字段。
    即只会记录数据,而不会更改mapping
    搜索sex:男的时候是搜索不到的,但搜索age:23的时候是可以看到这条数据的。

    动态映射

    当dynamic等于true时,文档中碰到一个以前没见过的字段时,动态映射可以自动决定该字段的类型,并对该字段添加映射

    ```groovy
    查看映射
    GET m1/_mapping
    结果
    {
    "m1" : {
    "mappings" : {
    "dynamic" : "true",
    "properties" : {
    "age" : {
    "type" : "long"
    },
    "name" : {
    "type" : "text"
    },
    "sex" : { #当dynamic:true的时候,新增未知sex会根据值的类型来添加映射
    "type" : "text",
    "fields" : {
    "keyword" : {
    "type" : "keyword",
    "ignore_above" : 256
    }
    }
    }
    }
    }
    }
    }

    ### 严格模式
    当dynamic:strict的时候,elasticsearch如果遇到新字段,会抛出异常
    ```groovy
    PUT m1/_doc/2
    {
    "name": "小黑",
    "age": 18
    }
    #添加一个原本不存在的字段
    PUT m1/_doc/3
    {
    "name": "小白",
    "age": 18,
    "sex": "不详"
    }

    结果是会报错的

    {
    "error" : {
    "root_cause" : [
      {
        "type" : "strict_dynamic_mapping_exception",
        "reason" : "mapping set to strict, dynamic introduction of [sex] within [_doc] is not allowed"
      }
    ],
    "type" : "strict_dynamic_mapping_exception",
    "reason" : "mapping set to strict, dynamic introduction of [sex] within [_doc] is not allowed"
    },
    "status" : 400
    }

数据类型

  • 字符串型:text、keyword(不会分词)注:在 ES 5.x 之后 string 类型已经不再支持了

  • 数值型:long、integer、short、byte、double、float、half_float、scaled_float等
    数字类型的字段在满足需求的前提下应当尽量选择范围较小的数据类型,字段长度越短,搜索效率越高,对于浮点数,可以优先考虑使用 scaled_float 类型,该类型可以通过缩放因子来精确浮点数,例如 12.34 可以转换为 1234 来存储。

  • 日期类型:date
    格式化的日期字符串,例如 2020-08-118 00:00、2020/08/18时间戳(和 1970-01-01 00:00:00 UTC 的差值),单位毫秒或者秒即使是格式化的日期字符串,ES 底层依然采用的是时间戳的形式存储。

  • 布尔类型:boolean

  • 二进制类型:binary
    二进制类型 binary 接受 BASE64 编码的字符串,默认 store 属性为 false,并且不可以被搜索。

属性名字 说明
text 用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引
keyword 不分词,适合简短、结构化字符串,例如主机名、姓名、商品名称等,可以用于过滤、排序、聚合检索,也可以用于精确查询。
long 有符号64-bit integer:-2^63 ~ 2^63 - 1
integer 有符号32-bit integer,-2^31 ~ 2^31 - 1
short 有符号16-bit integer,-32768 ~ 32767 -2^15~ 2^15-1
byte 有符号8-bit integer,-128 ~ 127
double 64-bit IEEE 754 浮点数
float 32-bit IEEE 754 浮点数
half_float 16-bit IEEE 754 浮点数
boolean true,false
date https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html
binary 该类型的字段把值当做经过 base64 编码的字符串,默认不存储,且不可搜索
"height":{
        "type":"byte"
      }

      当height字段的值超出了127或者小于-129时 会报错
      "reason" : "Value [-129] is out of range for a byte"

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注