在elasticsearch中对子聚合进行过滤

时间:2016-04-26 00:26:23

标签: elasticsearch

我正在尝试对聚合数据运行后置过滤器,但它无法正常工作。有人可以查看我的查询,并建议我在这里做错了什么。

    "query" : {
    "bool" : {
      "must" : {
        "range" : {
          "versionDate" : {
            "from" : null,
            "to" : "2016-04-22T23:13:50.000Z",
            "include_lower" : false,
            "include_upper" : true
          }
        }
      }
    }
  },
  "aggregations" : {
    "associations" : {
      "terms" : {
        "field" : "association.id",
        "size" : 0,
        "order" : {
          "_term" : "asc"
        }
      },
      "aggregations" : {
        "top" : {
          "top_hits" : {
            "from" : 0,
            "size" : 1,
            "_source" : {
              "includes" : [ ],
              "excludes" : [ ]
            },
            "sort" : [ {
              "versionDate" : {
                "order" : "desc"
              }
            } ]
          }
        },
        "disabledDate" : {
          "filter" : {
            "missing" : {
              "field" : "disabledDate"
            }
          }
        }
      }
    }
  }
}

查询中的步骤:

  1. 按indexDate过滤小于或等于给定日期。
  2. 基于formId的聚合。每个formId形成桶。
  3. 按降序排序并返回每个桶的最高点击结果。
  4. 在sort subaggregation之后运行子聚合过滤器,并从禁用日期不为null的存储桶中删除所有文档。(这不起作用)

1 个答案:

答案 0 :(得分:0)

post_filter的目的是在计算聚合后运行。因此,post_filter对聚合结果没有任何影响。

您可以执行的操作是应用顶级filter aggregation,以便在汇总时不考虑没有disabledDate的文档,即只考虑与的文档strong> disabledDate

{
  "query": {
    "bool": {
      "must": {
        "range": {
          "versionDate": {
            "from": null,
            "to": "2016-04-22T23:13:50.000Z",
            "include_lower": true,
            "include_upper": true
          }
        }
      }
    }
  },
  "aggregations": {
    "with_disabled": {
      "filter": {
        "exists": {
          "field": "disabledDate"
        }
      },
      "aggs": {
        "form.id": {
          "terms": {
            "field": "form.id",
            "size": 0
          },
          "aggregations": {
            "top": {
              "top_hits": {
                "size": 1,
                "_source": {
                  "includes": [],
                  "excludes": []
                },
                "sort": [
                  {
                    "versionDate": {
                      "order": "desc"
                    }
                  }
                ]
              }
            }
          }
        }
      }
    }
  }
}