ES宽表查询常见问题

ES宽表查询常见问题,本帖指的是想关联的子文档集合,以属性的形式嵌套在我们的父文档中:
直接创建索引

PUT my-index-000001

插入文档

PUT my-index-000001/_doc/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

执行布尔查询:

GET my-index-000001/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "user.first": "Alice" }},
        { "match": { "user.last":  "Smith" }}
      ]
    }
  }
}

很明显不应该命中,然而
在这里插入图片描述
出现这种原因是因为user默认是普通对象,在没有声明的情况下,会变成平铺式,所以就绕过了这个查询的联合match

怎么避免呢,可以使用es的特性指定对象是nested。

# 测试多表
DELETE my-index-000001
# 重建索引
PUT my-index-000001
{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      }
    }
  }
}
#插入数据
PUT my-index-000001/_doc/1
{
  "group" : "fans",
  "user" : [ 
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

测试使用原来的语句终于不会被绕过去了,但是修改成user.last改成"White"也不行,其实是其有自己特定的语法:

GET my-index-000001/_search
{
  "query": {
    "bool": {
      "must": [
         {
            "nested": {
              "path": "user",
              "query": {
                "bool": {
                  "must": [
                    { "match": { "user.first":  "Alice" }},
                    {"match": {"user.last": "White"}}
                  ]
                }
              }
            }
         }
      ]
    }
  }
}

结果:在这里插入图片描述
而last使用Smith是不行,修复问题了

#使用nested
GET my-index-000001/_search
{
  "query": {
    "bool": {
      "must": [
         {
            "nested": {
              "path": "user",
              "query": {
                "bool": {
                  "must": [
                    { "match": { "user.first":  "Alice" }},
                    {"match": {"user.last": "Smith"}}
                  ]
                }
              }
            }
         }
      ]
    }
  }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值