elasticsearch mapping 映射

Mapping 作用

定义index 中的字段名、字段的类型,包括相关 配置setting

如果没有手动配置mapping, Elasticsearch 默认会自动解析出类型,以每个字段第一次出现为准。
手动配置 mapping
PUT /user/
{
    "mappings": {
      "doc": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "firstname": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "age": {
            "type": "long",
            "index": false
          },
          "job": {
            "type": "keyword"
          },
          "intro":{
            "type":"text"
          },
          "create_time": {
            "type": "date", 
            "format": "epoch_second"
        }
        }
     }
  }
}

name: text类型,可分词,支持模糊索引
name.firstname: keyword类型, 只能精确配置,不支持分词, 超过256字符不索引没法被搜索
age:long类型,精确匹配
job: keyword类型, 只能精确匹配,不分词
intro: text类型, 分词,模糊检索
create_time:date类型,时间戳

字符串类型

有 text 和 keyword 2钟, 其中text支持分词, 用于全文搜索; keyword不支持分词, 用于聚合和排序;
模糊搜索 + 精确匹配 一般是 name 或 title 字段。

"name":{
    "type": "text",
        "analyzer": "ik_smart",    # 该字段使用ik分词
        "fields": {
          "firstname": {
            "type": "keyword",
            "ignore_above": 256
          }
       }
    }
}
数字类型

long、integer、short、byte、double、float、scaled_float(缩放类型浮点数,要与缩放因子一起使用, 例如价格56.78,缩放因子为100,那么存起来就是5678)、half_float(半精度浮点数)

日期类型

date:可以是格式化的日期字符串、秒级时间戳、毫秒级时间戳, 但在elasticsearch内部会被转化成long类型表示的毫秒级时间戳。

布尔类型

boolean:true、false、“true”、“false”

二进制类型

binary:接收 base64 编码的字符串,默认不存储(store 属性取值为 falsestore属性官方文档),也不可被搜索。

"pic": {"type": "binary"}
范围类型

integer_range, float_range, long_range, double_range, date_range

复杂数据类型
数组类型:

数据中元素的类型必须是一致的。字符型数组、整型数组、对象数组

Object对象类型: json 对象类型

写入到es中后,文档会被索引成简单的 key-value 对,例如:

{
  “region”: "US",
  ”manager“:{
    “age”: 30,
    "name": {
        "first":"John",
        "last": "Smith"
    }
  }
}
    | |
    | | 转换成:
    \ /
{
  "region": "US",
  "manager.age": 30,
  "manager.name.first": "John",
  "manager.name.last": "Smith"
}
嵌套类型 nested 它允许对象数组以可以彼此独立查询的方式进行索引,使用例子查看父子与嵌套关系中的嵌套关系。

nested彼此独立查询 是指:
如果使用 Object 类型存储查询有时会出现下面问题:

# 某文档结构
PUT /my_index/my_type/1
{
  "group": "fans",
  "user":[
    {
      "first": "John",
      "last": "Smith"
    },  
   {
      "first": "Alice",
      "last": "White"
    }
  ]
}

user 字段会被动态添加为 Object 类型,最后会被转换为以下扁平形式:

{
  "group":  "fans",
  "user.first": ["alice", "john"],
  "user.last": ["smith", "white"]
}

user.fistuser.last 转为扁平化后变为多值字段,first 和 last 的关联关系就丢失了。执行以下搜索会搜到上面的结果:

GET /my_index/_search

{
  "query": {
    "bool": {
      "must": [
         {"match": {"user.first": "Alice"}},
         {"match": {"user.last": "Smith"}} 
       ]
    }
  }
}

然而事实上不应该匹配到的,如果要索引对象数组并且要避免产生上述问题,就应该使用 nested 对象类型而不是 Object类型, nested 对象类型可以保持数组中每个对象的独立性:

PUT /my_index
{
    "mappings": {
        "my_type": {
            "properties":{
                "type": "nested"
            }
        }
    }
}
特定专用类型

ip类型:用于存储ipv4、ipv6
地理坐标类型:geo_point “lat”: 41.12, “lon”: -71.34
地理形状类型:geo_shape
completion类型: completion提供自动补全建议
token count类型:用来统计夫字段生成的index的数量

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值