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"}
}
}
}
}
}
/reviews
有四个字段,rating, content, product_id, author
,它们具有不同的类型定义, 其中author字段是Object类型。
使用_mapping
API可以取出索引的定义:
往/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"
}
}
通过使用“.”符号也可以定义对象:
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的定义一样:
已有的类型和字段映射不可以被更新,改变映射会破坏已经索引好的文档。 但可以往已有映射中添加新的字段。
向上面reviews
索引中加入新的字段create_at
:
PUT /reviews/_mapping
{
"properties":{
"create_at":{"type":"date"}
}
}
访问_mapping
API,新的字段已被加入mapping字义中: