一个JSON对象,可以选择object类型多个JSON对象,可以选择nested类型假设有一个人员信息如下:
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
建表时会建一个字段存一个值,它的缺点是字段扁平化, 无法直观的表现层级关系。
| 字段 | 值 |
|---|---|
| region | US |
| manager_age | 30 |
| manager_firstname | John |
| manager_lastname | Smith |
ES中,一个字段存的就是一个JSON,JSON格式本身就包含嵌套的层级关系。
region和managermanager包含2个字段: age和namename包含2个字段:first和lastPUT pigg_test_object
{
"mappings": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": {
"type": "integer"
},
"name": {
"properties": {
"first": {
"type": "keyword"
},
"last": {
"type": "keyword"
}
}
}
}
}
}
}
}
PUT pigg_test_object/_doc/1
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
在ES内部,这些值其实是按如下格式存储的
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John",
"manager.name.last": "Smith"
}
查询子字段时,得输入字段的全名,如manager.name.first
GET /pigg_test_object/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"manager.name.first": {
"value": "John"
}
}
}
]
}
}
}
PUT pigg_test_object/_doc/1
{
"region":"US",
"manager":[
{
"age":30,
"name":{
"first":"John",
"last":"Smith"
}
},
{
"age":40,
"name":{
"first":"Geen",
"last":"Hank"
}
}
]
}
查询30岁的Geen按照正常理解,是不应该查询出来结果的,但是它能返回数据
GET /pigg_test_object/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"manager.age": {
"value": "30"
}
}
},
{
"term": {
"manager.name.first": {
"value": "Geen"
}
}
}
]
}
}
}
这是因为在ES内部,数据会如下格式存储
{
"region": "US",
"manager.age": [30, 40],
"manager.name.first": ["John", "Geen"],
"manager.name.last": ["Smith", "Hank"]
}
这样的存储方式没有把2个人信息分开存储,而是混合在一起,所以有了文章开头的结论:
一个JSON对象,可以选择object类型多个JSON对象,可以选择nested类型enabled参数只用于object类型,默认值是true(开启)实验如下:
PUT pigg_test_enabled
{
"mappings": {
"properties": {
"name": {"enabled": false}
}
}
}
插入多种格式的值
PUT pigg_test_enabled/_doc/1
{
"name": "winter"
}
PUT pigg_test_enabled/_doc/2
{
"name": {
"first_name": "wang",
"last_name": "dong"
}
}
GET pigg_test_enabled/_search
返回发现: 不同的值都可以存入
"hits" : [
{
"_index" : "pigg_test_enabled",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "winter"
}
},
{
"_index" : "pigg_test_enabled",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : {
"first_name" : "wang",
"last_name" : "dong"
}
}
}
]
查看mapping
GET pigg_test_enabled/_mapping
返回如下: name类型是object, 并不会解析name在其下面添加first_name和last_name子字段
{
"pigg_test_enabled" : {
"mappings" : {
"properties" : {
"name" : {
"type" : "object",
"enabled" : false
}
}
}
}
}
在enable=false的字段上检索文档, 是查询不到数据的
GET pigg_test_enabled/_search
{
"query": {
"term": {
"name": {
"value": "winter"
}
}
}
}
返回没有数据
下一篇博客会详细讲解nested类型,如果本文对您有帮助,就给亚瑟王点个赞👍吧。