在elasticsearch中按父值过滤子项

时间:2015-08-19 14:10:15

标签: elasticsearch

我有一个包含三种文档类型的索引:

  • 领导 - 有和身份和类型(帐户的孩子)
  • 帐户 - 拥有ID
  • 付款 - 拥有和id,类型和account_id(帐户的子女)

他们都处于亲子关系中。 我想获得有关我拥有哪种潜在客户类型的统计数据(按类型分组),然后计算这种特定类型的付款数量。

我来到这个查询,但我无法按父类型过滤子聚合。 查询Lead类型

{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "by_type": {
      "terms": {
        "field": "type"
      },
      "aggs": {
        "payments_count": {
          "filter": {
            "and": [
              {
                "has_parent": {
                  "type": "account",
                  "query": {
                    "filtered": {
                      "query": {
                        "match_all": {}
                      },
                      "filter": {
                        "and": [
                          {
                            "has_child": {
                              "type": "payment",
                              "query": {
                                "filtered": {
                                  "query": {
                                    "match_all": {}
                                  },
                                  "filter": {
                                    "and": [
                                      {
                                        "term": {
                                          "type": ?????????
                                        }
                                      }
                                    ]
                                  }
                                }
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
}

在上一个has_child过滤器中,我想知道如何通过它的父级lead.type过滤子项,如下所示:

"filter": {
    "and": [
      {
        "term": {
          "type": "$lead.type"
        }
      }
    ]
}

此外,由于lead类型上的其他聚合,我无法反转此查询。

非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您正在针对类型"引导"运行您的查询,所以如果你想过滤" lead.type",你应该把它作为第一个过滤器聚合,然后再进入它的父节点。

"payments_count": {
  "filter": {
    "and": [
     {
        "term": {
          "type": "$lead.type"
        }
     },
     {
       "has_parent": {
       ...

也许我的查询也有帮助,因为它有点类似:Term Filter on a nested field called id does not work as expected