欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elasticsearch mapping 映射

程序员文章站 2024-03-02 20:33:10
...

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的数量