思维导图
前言
在第5章,我们说完 ES 常用字段类型。但是,并未跟大家解释,为什么不设置 Mapping,写入的字符串,默认就可以全文搜索。例如
PUT /test4/_doc/1
{
"name": "hello world"
}
GET /test4/_search
{
"query": {
"match_bool_prefix": {
"name": {
"query": "search wor",
"operator": "or"
}
}
}
}
这一切都跟 ES 的 dynamic mapping
功能有关。下面我将介绍这一功能。
Dynamic Mapping
可选值介绍
dynamic mapping 默认是开启的。 ES 有以下 4 个可选值
- • true: 往文档写入新字段时,会自动创建字段类型(默认值)
- • runtime: 往文档写入新字段时,会自动创建字段类型, 与 true 的区别为,2者字段映射不一样
- • false: 忽略该字段,无法检索该字段,但是文档中可以看到该字段
- • strict: 有新字段,则拒绝本次写入
设置 dynamic mapping
创建索引时,手动设置 dynamic
属性值
PUT test4
{
"mappings": {
"dynamic": "false",
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"ctime": {
"type": "date"
}
}
}
}
修改已存在的索引的 dynamic
值
PUT test4/_mapping
{
"dynamic": true
}
字段映射默认值
JSON date type | “dynamic”:“true” | “dynamic”:“runtime” |
---|---|---|
null | 不添加字段 | 不添加字段 |
true 或 false | boolean | boolean |
double | float | double |
long | long | long |
object | object | 不添加字段 |
array | 以数组中第一个不为空的元素为准 | 以数组中第一个不为空的元素为准 |
日期字符串(更多见下文 date detection) | date | date |
数字字符串(更多见下文 number detection) | float 或 long | double 或 long |
不匹配日期、数字的字符串 | text 以及 .keyword 的子字段 | keyword |
回答开篇提出的问题
学习到这里,就可以解释开篇提出的问题了:为什么不设置 Mapping,写入的字符串,默认就可以全文搜索?
因为索引的 dynamic 默认为 true,当输入的非日期、数字字符串时,会被自动映射为 text 以及携带 .keyword 子字段。
DELETE test4
PUT test4/_doc/1
{
"name": "hello world"
}
GET test4/_mapping
Date detection
dete_tection 功能默认启用,即如果添加了一个新的字符串字段,且满足该数据格式 [ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
则会添加一个 date 字段。
禁用 date detection
创建索引时,设置 date_tection
值
DELETE test4
PUT test4
{
"mappings": {
"dynamic": "false",
"date_detection": false,
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"ctime": {
"type": "date"
}
}
}
}
修改已存在的索引的 date_tection
值
PUT test4/_mapping
{
"dynamic": true,
"date_detection": true
}
自定义 date detection
创建索引时,设置 dynamic_date_formats
值
DELETE test4
PUT test4
{
"mappings": {
"dynamic": "false",
"date_detection": false,
"dynamic_date_formats": ["MM/dd/yyyy"],
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"ctime": {
"type": "date"
}
}
}
}
修改已存在的索引的 dynamic_date_formats
值
PUT test4/_mapping
{
"dynamic": true,
"date_detection": true,
"dynamic_date_formats": ["MM/dd/yyyy"]
}
Number detection
numeric_detection
默认是被禁用的。
DELETE test4
PUT test4
{
"mappings": {
"numeric_detection": true
}
}
结语
本章介绍了 ES dynamic mapping
。下一章,将介绍 ES 的 dynamic template
,其可以更好的控制 ES 的字段映射。dynamic template
功能在开发中也相对比较常用。