• ElasticSearch - 映射(mapping)


    官方文档

    一、数据类型

    1、核心数据类型

    • string 字符串
    字符类型说明
    text⽤于全⽂索引,搜索时会自动使用分词器进⾏分词再匹配。字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项
    keyword不分词,搜索时需要匹配完整的值
    • numberic 数值
    整数类型说明 (1byte(字节)=8bit(位、比特))
    byte(1字节)-128 到127(- 2^7 到 2^7– 1)
    short(2字节)-32,768到32,767 (- 2^15 到 2^15– 1)
    integer(4字节)-2,147,483,648到2,147,483,647 (- 2^31 到 2^31– 1)
    long(8字节)(- 2^63 到 2^63– 1)
    浮点类型说明
    float32位单精度IEEE 754浮点类型
    double64位双精度IEEE 754浮点类型
    half_float16位半精度IEEE 754浮点类型
    scaled_float缩放类型的的浮点数(比如价格只需要精确到分,price为57.34的字段缩放因子为100,存起来就是5734)
    • 日期类型
    类型说明
    datedate类型支持到毫秒 参考
    date_nanosdate类型支持到纳秒 参考
    • Boolean
    类型说明
    booleantrue/false
    • binary 二进制
    类型说明
    binary该binary类型接受二进制值作为 Base64编码的字符串
    • range 范围
    范围类型说明
    integer_range一个带符号的32位整数范围,最小值为,最大值为。 -2^31到 2^31-1
    float_range一系列单精度32位IEEE 754浮点值
    long_range一系列带符号的64位整数,最小值为,最大值为。 -2^63 到 2^63-1
    double_range一系列双精度64位IEEE 754浮点值
    date_range自系统时代以来经过的一系列日期值,表示为无符号的64位整数毫秒
    ip_range支持IPv4或 IPv6(或混合)地址的一系列ip值

    2、复杂数据类型

    • object 对象
    对象类型说明
    object对象,用于单个JSON对象

    由于 JSON 本身具有层级关系,所以文档包含内部对象。内部对象中,还可以再包含内部对象。

    PUT product/_doc/2
    {
      "date":"2020-11-11T11:11:11Z",
      "ext_info":{
        "address":"China"
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • nested 嵌套
    对象类型说明
    array嵌套JSON对象数组 参考

    nested 是 object 中的一个特例。

    如果使用 object 类型,假如有如下一个文档:

    {
      "user":[
        {
          "first":"Zhang",
          "last":"san"
        },
        {
          "first":"Li",
          "last":"si"
        }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    由于 Lucene 没有内部对象的概念,所以 es 会将对象层次扁平化,将一个对象转为字段名和值构成的简单列表。即上面的文档,最终存储形式如下:

    {
    	"user.first":["Zhang","Li"],
    	"user.last":["san","si"]
    }
    
    • 1
    • 2
    • 3
    • 4

    扁平化之后,用户名之间的关系没了。这样会导致如果搜索 Zhang si 这个人,会搜索到。

    此时可以 nested 类型来解决问题,nested 对象类型可以保持数组中每个对象的独立性。nested 类型将数组中的每一对象作为独立隐藏文档来索引,这样每一个嵌套对象都可以独立被索引。

    {
    	{
    		"user.first":"Zhang",
    		"user.last":"san"
    	},{
    		"user.first":"Li",
    		"user.last":"si"
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3、地图数据类型

    • Geo-point 地理位置数据(纬度-经度)
    地理位置数据类型说明
    geo_pointgeo_point为纬度/经度点 参考
    • Geo-shape 地理形状数据类型
    地理形状数据类型说明
    geo_shapegeo_shape支持存储的常用形状数据有:点(point)圆形(circle)矩形(envelope)多边形 (polygon) 参考

    4、专用的数据类型

    专用的数据类型说明
    ipip用于IPv4和IPv6地址
    Completion data type提供自动完成建议
    Token count计算字符串中令牌的数量
    mapper-murmur3在索引时计算值的哈希并将其存储在索引中
    mapper-annotated-textannotated-text 索引包含特殊标记的文本(通常用于标识命名实体)
    Percolator接受来自query-dsl的查询
    Join为同一索引内的文档定义父/子关系
    Rank feature记录数字功能以提高查询时的点击率
    Rank features记录数字功能以提高查询时的点击率
    Dense vector记录浮点值的密集向量
    Sparse vector记录浮点值的稀疏向量
    Search-as-you-type针对查询进行优化的类文本字段,以实现按需输入完成
    Alias为现有字段定义别名。
    FlattenedAllows an entire JSON object to be indexed as a single field
    Shapeshape 对于任意笛卡尔几何
    Histogramhistogram 用于百分位数聚合的预聚合数值。
    Constant keywordkeyword当所有文档具有相同值时的情况的 专业化。

    二、映射(Mapping)

    Mapping 类似于数据库中的表结构定义 schema

    1、动态映射(Dynamic Mapping)

    Dynamic Mapping 机制使我们不需要手动定义 Mapping,ES 类型的自动识别是基于 JSON 的格式,如果输入的是 JSON 是字符串且格式为日期格式,ES 会自动设置成 Date 类型;当输入的字符串是数字的时候,ES 默认会当成字符串来处理,可以通过设置来转换成合适的类型;如果输入的是 Text 字段的时候,ES 会自动增加 keyword 子字段,还有一些自动识别如下图所示:
    在这里插入图片描述

    当我们在创建一个索引的时候,可以对 dynamic 进行设置,可以设成 false、true 或者 strict。

    • true:遇到陌生字段,就进行dynamic mapping
    • false:遇到陌生字段,就忽略
    • strict:遇到陌生字段,就报错
    PUT /my_index
    {
      "mappings": {
        "dynamic": "strict",       #设置了strict,添加字段报错
        "properties": {
          "title": {
            "type": "text"
          },
          "address": {
            "type": "object",
            "dynamic": "true"      #设置为true可以添加字段
          }
        }
      }
    }
    
    
    PUT /my_index/_doc/1
    {
      "title": "my article",
      "content": "this is my article",        #添加新的字段
      "address": {
        "province": "guangdong",
        "city": "guangzhou"             #添加新的字段
      }
    }
    
    #报错,content字段无法新增
    {
      "error": {
        "root_cause": [
          {
            "type": "strict_dynamic_mapping_exception",
            "reason": "mapping set to strict, dynamic introduction of [content] within [_doc] is not allowed"
          }
        ],
        "type": "strict_dynamic_mapping_exception",
        "reason": "mapping set to strict, dynamic introduction of [content] within [_doc] is not allowed"
      },
      "status": 400
    }
     
    #成功,city、province字段可以新增
    PUT /my_index/_doc/1
    {
      "title": "my article",
      "address": {
        "province": "guangdong",
        "city": "guangzhou"        #添加新的字段
      }
    }
     
    #最后的映射
    GET /my_index/_mapping
    
    #返回数据
    {
      "my_index" : {
        "mappings" : {
          "dynamic" : "strict",
          "properties" : {
            "address" : {
              "dynamic" : "true",
              "properties" : {
                "city" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                },
                "province" : {
                  "type" : "text",
                  "fields" : {
                    "keyword" : {
                      "type" : "keyword",
                      "ignore_above" : 256
                    }
                  }
                }
              }
            },
            "title" : {
              "type" : "text"
            }
          }
        }
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92

    2、手动创建映射

    ES 自动根据文档信息来判断字段合适的类型时,有时候也会推算的不对,比如地理位置信息有可能会判断为 Text,当类型如果设置不对时,会导致一些功能无法正常工作,比如 Range 查询,所以我们可以手动创建映射。

    可以在需要在创建索引的时候先指定映射,这样就可以就可以避免自动创建映射导致字段类型不正确。

    示例:

    PUT /my_index
    {
      "mappings": {
        "properties": {
          "user": {
            "properties": {
              "title": {
                "type": "text"
              },
              "name": {
                "type": "text"
              },
              "age": {
                "type": "integer"
              }
            }
          },
          "blogpost": {
            "properties": {
              "title": {
                "type": "text"
              },
              "body": {
                "type": "text"
              },
              "user_id": {
                "type": "keyword"
              },
              "created": {
                "type": "date",
                "format": "strict_date_optional_time||epoch_millis"
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
  • 相关阅读:
    普瑞PS8742 Switch V0.9
    Mac中无法运行旧版本印象笔记:版本太旧 你的本地印象笔记数据是由新版印象笔记管理
    【Java每日一题】——第二十八题:编程定义一个学生类汽车类Car(2023.10.12)
    做社交媒体营销应该注意些什么?Shopline卖家的成功秘笈在这里!
    【Unity3D】动态路障导航
    Linux 错误码
    Vue 和 React 前端框架的比较
    OpenCV校准棋盘集合
    Redis RDB持久化与AOF 持久化详解
    《Effective C++》条款17
  • 原文地址:https://blog.csdn.net/qq_42764269/article/details/126738873