bool类型0和1真假_ES中使用nested类型的内嵌对象

f8476c73595f3caa5e38ea2606408c7b.png

在 Elasticsearch 中处理关联关系

关系型数据库,一般会考虑 Normalize 数据;在 Elasticsearch,往往考虑 Denormalize 数据

Denormalize 的好处:读的速度变快、无需表连接、无需行锁

Elasticsearch 并不擅长处理关联关系,我们一般采用以下四种方法处理关联

对象类型

嵌套对象(Nested Object)

父子关联关系(Parent 、Child)

应用端关联

案例 1:

对象类型

在每个博客的问下中都保留作者的信息

如果作者信息发生变化,需要修改相关的博客文档

PUT /blog
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text"
      },
      "time": {
        "type": "date"
      },
      "user": {
        "properties": {
          "city": {
            "type": "text"
          },
          "userid": {
            "type": "long"
          },
          "username": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

# 插入一条 Blog 信息
PUT blog/_doc/1
{
  "content":"I like Elasticsearch",
  "time":"2019-01-01T00:00:00",
  "user":{
    "userid":1,
    "username":"Jack",
    "city":"Shanghai"
  }
}
通过一条查询语句即可获取到博客和作者信息
# 查询 Blog 信息
POST blog/_search
{
"query": {
"bool": {
  "must": [
    {"match": {"content": "Elasticsearch"}},
    {"match": {"user.username": "Jack"}}
  ]
}
}
}

案例 2:包含对象数组的文档

# 电影的Mapping信息
PUT my_movies
{
      "mappings" : {
      "properties" : {
        "actors" : {
          "properties" : {
            "first_name" : {
              "type" : "keyword"
            },
            "last_name" : {
              "type" : "keyword"
            }
          }
        },
        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
}

# 写入一条电影信息
POST my_movies/_doc/1
{
  "title":"Speed",
  "actors":[
    {
      "first_name":"Keanu",
      "last_name":"Reeves"
    },

    {
      "first_name":"Dennis",
      "last_name":"Hopper"
    }

  ]
}
# 查询电影信息
POST my_movies/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {"actors.first_name": "Keanu"}},
        {"match": {"actors.last_name": "Hopper"}}
      ]
    }
  }
}

为啥搜不到

储存时,内部对象的边界没有在考虑在内,JSON 格式被处理成扁平键值对的结构

当对多个字段进行查询时,导致了意外的搜索结果

可以用 Nested Data Type 解决这个问题

Nested Data Type

Nested 数据类型:允许对象数组中的对象呗独立索引

使用 Nested 和 Properties 关键词,将所有 actors 索引到对个分隔的文档

在内部,Nested 文档会被保存在两个 Lucene 文档中,查询时做 join 处理

PUT my_movies

{

"mappings" : {

"properties" : {

"actors" : {

"type": "nested",

"properties" : {

"first_name" : {"type" : "keyword"},

"last_name" : {"type" : "keyword"}

}},

"title" : {

"type" : "text",

"fields" : {"keyword":{"type":"keyword","ignore_above":256}}

}

}

}

}

嵌套查询

在内部,Nested 文档被保存在两个 Lucene 文档中

# Nested 查询

POST my_movies/_search

{

"query": {

"bool": {

"must": [

{"match": {"title": "Speed"}},

{

"nested": {

"path": "actors",

"query": {

"bool": {

"must": [

{"match": {

"actors.first_name": "Keanu"

}},

{"match": {

"actors.last_name": "Hopper"

}}

]

}

}

}

}

]

}

}

}

//返回

"hits" : {

"total" : {

"value" : 0,

"relation" : "eq"

},

"max_score" : null,

"hits" : [ ]

}

嵌套聚合

# Nested Aggregation

POST my_movies/_search

{

"size": 0,

"aggs": {

"actors": {

"nested": {

"path": "actors"

},

"aggs": {

"actor_name": {

"terms": {

"field": "actors.first_name",

"size": 10

}

}

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值