天天看点

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,用同样的条件对父类型查询,返回子类型数据分页列表结果,同时对子类型某字段进行聚合,获取该字段的聚合数据。

继续阅读