2015-11-09 143 views
1

過濾我有以下對象索引:彈性搜索聚合增強型嵌套查詢

{ "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- -01','角色1'和'角色2'將被選作第一個項目(即他們的項目),因爲'角色1'將因爲'角色2'由於'角色2'添加了日期標準,因此項目命中。

所以,我認爲,我應該額外增加的地方以下條件:

"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 
       } 
      }, 

回答

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": {} 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}