如何过滤术语聚合

时间:2014-06-16 20:04:50

标签: elasticsearch

目前我有类似的东西

aggs: {
  categories: {
    terms: {
      field: 'category'
    }
  }
}

这给了我每个类别的产品数量。但我有额外的条件。我需要获得每个类别中尚未销售的产品数量,因此我需要以某种方式对terms进行过滤。

使用聚合框架是否有一些优雅的方法,或者我需要编写过滤查询?

谢谢

2 个答案:

答案 0 :(得分:13)

您可以在Terms AggregationFilter Aggregation之间进行合并,这就是它的外观:(已测试)

    aggs: {
      categories: {            
        filter: {term: {sold: true}},
        aggs: {
          names: {
            terms: {field: 'category'}
          }
        }
      }
    }

您可以向过滤器添加更多条件,我希望这会有所帮助。

答案 1 :(得分:0)

只需添加到其他答案中,您还可以使用嵌套查询。这类似于我必须要做的。我正在使用Elasticsearch 5.2。

在文档中,以下是基本语法:

"aggregations" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}

这是我的实现方式:

GET <path> core_data/_search
{
  "aggs": {
    "NAME": {
      "nested": {
        "path": "ATTRIBUTES"
      },
      "aggs": {
        "NAME": {
          "filter": {
            "term": {
              "ATTRIBUTES.ATTR_TYPE": "EDUCATION_DEGREE"
            }
          },
          "aggs": {
            "NAME": {
              "terms": {
                "field": "ATTRIBUTES.DESCRIPTION",
                "size": 100
              }
            }
          }
        }
      }
    }
  }
}

这将数据过滤到一个存储桶中,这正是我所需要的。