elasticsearch进行parent/child类型聚合的测试

elasticsearch进行parent/child类型聚合的测试:

1、查询父类型可以inner_hits得到子类型数据,反之也行

{
  "query": {
    "has_child": {
      "query": {
        "match": {
          "lid": "00000"
        }
      },
      "child_type": "article",
      "inner_hits": {}
    }
  }
}


{
  "query": {
    "has_parent": {
      "query": {
        "match": {
          "content": "公司"
        }
      },
      "parent_type": "main",
      "inner_hits": {}
    }
  }
}
2、has_parent、has_child查询的时候,has_parent是通过查询父类型得到子类型的列表结果,has_child反之。

3、has_parent是通过查询父类型得到子类型的列表结果,这时同时对父类型某字段进行聚合,无聚合结果返回。has_child查询的时候对子类型某字段进行聚合也没有结果。

{
  "query": {
    "has_child": {
      "query": {
        "match": {
          "lid": "00000"
        },
        "aggs": {
          "group_by_mid": {//查询结果中没有聚合数据group_by_mid
            "terms": {
            "field": "mid"
           }
        }
       }
      },
      "child_type": "article",
      "inner_hits": {}
    }
  }
}

4、has_parent是通过查询父类型得到子类型的列表结果,这时同时对子类型某字段进行聚合,得到聚合结果,但是返回的查询列表也为子类型,虽然inner_hits可以得到对应父类型结果,但是如果父子是一对多关系,可能得到的单分页父类型数据有重复。

{
  "query": {
    "has_child": {
      "query": {
        "match": {
          "lid": "00000"
        }
      },
      "child_type": "article",
      "inner_hits": {}
    }
  },
  "aggs": {
    "group_by_years": {//有聚合数据group_by_years返回
      "terms": {
        "field": "years"
      }
    }
  }
}
5、因此,如果查询父类型,并且结果分页列表要显示父类型数据,同时还要取得相关子类型数据的聚合结果的话。只有查询两次实现:

1)对父类型进行普通的查询,并取得查询分页列表结果。

2)使用has_parent,用同样的条件对父类型查询,返回子类型数据分页列表结果,同时对子类型某字段进行聚合,获取该字段的聚合数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值