首先给出结论:
- 在一个字段存储
一个
JSON对象,可以选择object
类型 - 在一个字段存储
多个
JSON对象,可以选择nested
类型
一、传统数据库存object
假设有一个人员信息如下:
{
"region": "US",
"manager": {
"age": 30,
"name": {
"first": "John",
"last": "Smith"
}
}
}
建表时会建一个字段存一个值,它的缺点是字段扁平化
, 无法直观的表现层级关系
。
字段 | 值 |
---|---|
region | US |
manager_age | 30 |
manager_firstname | John |
manager_lastname | Smith |
二、ES存object
ES中,一个字段存的就是一个JSON,JSON格式本身就包含嵌套的层级关系。
2.1 创建mapping
- 一层有2个字段:
region
和manager
-
manager
包含2个字段:age
和name
-
name
包含2个字段:first
和last
PUT pigg_test_object
{
"mappings": {
"properties": {
"region": {
"type": "keyword"
},
"manager": {
"properties": {
"age": {
"type": "integer"
},
"name": {
"properties": {
"first": {
"type": "keyword"
},
"last": {
"type": "keyword"
}
}
}
}
}
}
}
}
2.2 插入数据
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"
}
2.3 查询object数据
查询子字段时,得输入字段的全名,如manager.name.first
GET /pigg_test_object/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"manager.name.first": {
"value": "John"
}
}
}
]
}
}
}
三、object不要存数组
3.1 存入object数组
- 30岁的John Smith
- 40岁的Geen Hank
PUT pigg_test_object/_doc/1
{
"region":"US",
"manager":[
{
"age":30,
"name":{
"first":"John",
"last":"Smith"
}
},
{
"age":40,
"name":{
"first":"Geen",
"last":"Hank"
}
}
]
}
3.2 验证错误的查询结果
查询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
类型
四、object的参数enabled
-
enabled
参数只用于object
类型,默认值是true(开启) - 为true时,ES会object里的所有字段进行索引操作, 这样就可以根据该字段检索文档
- 为false时,ES不去解析object里的字段,不会索引每个字段
- 当只需要返回该字段用于展示,而不需要索引某个字段时(例如session信息,我们很少用session作为查询条件),可设置enabled=false
实验如下:
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的字段上检索文档, 是查询不到数据的文章来源:https://www.toymoban.com/news/detail-709449.html
GET pigg_test_enabled/_search
{
"query": {
"term": {
"name": {
"value": "winter"
}
}
}
}
返回没有数据
下一篇博客会详细讲解nested
类型,如果本文对您有帮助,就给亚瑟王点个赞👍吧。文章来源地址https://www.toymoban.com/news/detail-709449.html
到了这里,关于【Elasticsearch教程12】Mapping字段类型之object的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!