显式映射 - Explicit Mappings

Elasticsearch 可以根据数据来推测数据类型,但你自己肯定更了解你的数据,所以尽管在刚使用Elasticsearch 的时候,动态映射机制可以大幅度减少配置量,但早晚有一天你会想要自己明确地来定义映射关系。

显式映射(Explicit Mappings)就是在创建索引的时候创建映射类型和字段映射,并且可以通过PUT mapping API添加映射类型和字段到一个已经存在的索引中。

显式映射允许我们更加精细化地定义文档,比如:哪些字段是全文搜索字段、哪些字段是数值型、日期数据类型的格式、自定义动态映射的规则等。

显式映射示例

在Kibana面板中,使用显示映射的方式创建索引定义:

PUT /reviews
{
  "mappings": {
    "properties": {
      "rating": {"type": "float"},
      "content": {"type": "text"},
      "product_id": {"type": "integer"},
      "author":{
        "properties": {
          "first_name": {"type":"text"},
          "last_name": {"type":"text"},
          "email": {"type":"keyword"}
        }
      }
    }
  }
}

image-20220716220003643

/reviews有四个字段,rating, content, product_id, author,它们具有不同的类型定义, 其中author字段是Object类型。


使用_mapping API可以取出索引的定义:

image-20220716220301342

/reviews索引中插入数据:

PUT /reviews/_doc/1
{
  "rating": 4.0,
  "content": "Outstanding movie!",
  "product_id": 123,
  "author": {
    "first_name": "John",
    "last_name": "Doe",
    "email": "johndoe@gmail.com"
  }
}

image-20220716220230367

dot notation

通过使用“.”符号也可以定义对象:

PUT /reviews_dot_notation
{
  "mappings": {
    "properties": {
      "rating": {"type": "float"},
      "content": {"type": "text"},
      "product_id": {"type": "integer"},
      "author.first_name":{"type": "text"},
      "author.last_name": {"type": "text"},
      "author.email": {"type": "keyword"}
    }
  }
}

效果和上面使用Object的定义一样:

image-20220716230458355

Add mappings to exsiting indices

已有的类型和字段映射不可以被更新,改变映射会破坏已经索引好的文档。 但可以往已有映射中添加新的字段。

向上面reviews索引中加入新的字段create_at

PUT /reviews/_mapping
{
  "properties":{
    "create_at":{"type":"date"}
  }
}

访问_mapping API,新的字段已被加入mapping字义中:

image-20220716231337697