Mapping和常见字段类型
# 一、Mapping
Mapping类似数据库中的schema的定义,作用如下:
- 定义索引中的字段的名称
- 定义字段的数据类型,例如字符串、数字、布尔...
- 字段、倒排索引的相关配置
# 二、字段的数据类型
- 简单类型
- Text / Keyword
- Date
- Integer / Floating
- Boolean
- 复杂类型 - 对象和嵌套对象
- 对象类型 / 嵌套类型
- 特殊类型
- geo_point & gro_shape
# 三、Dynamic Mapping
- 在写入文档的时候,如果索引不存在,会自动创建索引。
- Dynamic Mapping的机制,使得开发人员无需定义定义Mapping,ES会自动根据文档信息,推算出字段的类型
JSON类型 | Elasticsearch类型 |
---|---|
字符串 | - 日期格式,设置为Date - 设置为Text,并添加keyword字段 |
布尔值 | boolean |
浮点数 | flooat |
整数 | long |
对象 | Object |
数组 | 由第一个非空数值的类型决定 |
# 四、案例实践
# 1、字段类型推断
#dynamic mapping,推断字段的类型
PUT mapping_test/_doc/1
{
"uid" : "123",
"isVip" : false,
"isAdmin": "true",
"age":19,
"heigh":180
}
#查看 Dynamic
GET mapping_test/_mapping
{
"mapping_test" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"heigh" : {
"type" : "long"
},
"isAdmin" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"isVip" : {
"type" : "boolean"
},
"uid" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
# 2、Dynamic Mapping三种类型
Dynamic是可以被设置成:true、false、strict三种类型:
true | false | strict | |
---|---|---|---|
文档可索引 | Yes | Yes | No |
字段可索引 | Yes | No | No |
Mapping被更新 | Yes | No | No |
true
#默认Mapping支持dynamic,写入的文档中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
"newField":"someValue"
}
#该字段可以被搜索,数据也在_source中出现
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"newField":"someValue"
}
}
}
false
#修改为dynamic false
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
#新增 anotherField
PUT dynamic_mapping_test/_doc/10
{
"anotherField":"someValue"
}
#该字段不可以被搜索,因为dynamic已经被设置为false
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"anotherField":"someValue"
}
}
}
get dynamic_mapping_test/_doc/10
strict
#修改为strict
PUT dynamic_mapping_test/_mapping
{
"dynamic": "strict"
}
#写入数据出错,HTTP Code 400
PUT dynamic_mapping_test/_doc/12
{
"lastField":"value"
}
# 五、显示指定Mapping
通过上面的学习我们知道ES会自动根据文档信息,推算出字段的类型,但是有时候这个推算并不正确,或者我们需要自行来指定字段的类型,这时候就需要显示指定。
# 1、控制当前字段是否可以被索引
DELETE users
PUT users
{
"mappings" : {
"properties" : {
"firstName" : {
"type" : "text"
},
"lastName" : {
"type" : "text"
},
"mobile" : {
"type" : "text",
"index": false
}
}
}
}
PUT users/_doc/1
{
"firstName":"Ruan",
"lastName": "Yiming",
"mobile": "12345678"
}
POST /users/_search
{
"query": {
"match": {
"mobile":"12345678"
}
}
}
通过设置index为fasle,实现了对mobile字段不可以被索引。
# 2、实现对Null值检索
#设定Null_value
DELETE users
PUT users
{
"mappings" : {
"properties" : {
"firstName" : {
"type" : "text"
},
"lastName" : {
"type" : "text"
},
"mobile" : {
"type" : "keyword",
"null_value": "NULL"
}
}
}
}
PUT users/_doc/1
{
"firstName":"Ruan",
"lastName": "Yiming",
"mobile": null
}
PUT users/_doc/2
{
"firstName":"Ruan2",
"lastName": "Yiming2"
}
GET users/_search
{
"query": {
"match": {
"mobile":"NULL"
}
}
}
# 参考
上次更新: 2024/06/29, 15:13:44