【问题标题】:Elastic Search aggregation enhanced filtering for nested query用于嵌套查询的 Elastic Search 聚合增强过滤
【发布时间】:2016-02-10 17:34:13
【问题描述】:

我为以下对象编制了索引:

{ "ProjectName" : "Project 1",
  "Roles" : [
     { "RoleName" : "Role 1", "AddedAt" : "2015-08-14T17:11:31" },
     { "RoleName" : "Role 2", "AddedAt" : "2015-09-14T17:11:31" } ] }

{ "ProjectName" : "Project 2",
  "Roles" : [
     { "RoleName" : "Role 1", "AddedAt" : "2015-10-14T17:11:31" } ] }

{ "ProjectName" : "Project 3",
  "Roles" : [
     { "RoleName" : "Role 2", "AddedAt" : "2015-11-14T17:11:31" } ] }

即,在不同时间添加的具有不同角色的项目列表。 (角色列表是一个嵌套字段)

我需要进行聚合,以选择每个特定角色存在多少个项目,但仅(!)如果角色在特定时期被添加到项目中

一个经典的查询(没有日期和过滤)看起来像这样(并且效果很好):

{ // ... my main query here

"aggs" : {
    "agg1" : {
        "nested" : {
            "path" : "Roles"
        },
        "aggs" : {
            "agg2": {                    
                "terms": {
                    "field" : "Roles.RoleName"
                },
                "aggs": {
                    "agg3":{
                        "reverse_nested": {}
                    }}}}}}

但是这种方法对我不起作用,因为如果我需要按从“2015-09-01”开始的日期进行过滤,则两者都是“角色 1”并且“角色 2”将被选择用于第一个项目(即他们的项目),因为“角色 1”会命中,因为“角色 2”的项目会因为“角色 2”AddedAt 日期标准而命中。

所以,我认为,我应该在某个地方另外添加以下条件:

"range": { "Roles.AddedAt": {
                                "gte": "2015-09-01T00:00:00",
                                "lte": "2015-12-02T23:59:59"
                             }}

但我找不到正确的方法。


工作查询的结果(有点)如下:

"aggregations": {
  "agg1": {
     "doc_count": 17,
     "agg2": {
        "buckets": [
           {
              "key": "Role 1",
              "doc_count": 2,
              "agg3": {
                 "doc_count": 2
              }
           },
           {
              "key": "Role 2",
              "doc_count": 2,
              "agg3": {
                 "doc_count": 2
              }
           },

【问题讨论】:

    标签: json elasticsearch grouping nosql-aggregation nosql


    【解决方案1】:

    试试这个:

    {
      "aggs": {
        "agg1": {
          "nested": {
            "path": "Roles"
          },
          "aggs": {
            "NAME": {
              "filter": {
                "query": {
                  "range": {
                    "Roles.AddedAt": {
                      "gte": "2015-09-01T00:00:00",
                      "lte": "2015-12-02T23:59:59"
                    }
                  }
                }
              },
              "aggs": {
                "agg2": {
                  "terms": {
                    "field": "Roles.RoleName"
                  },
                  "aggs": {
                    "agg3": {
                      "reverse_nested": {}
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多