2015-11-09 3 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" } ] } 

есть, список проектов с различными ролями добавлена, добавлен в разное время. (список ролей вложенное поле)

Что мне нужно иметь агрегацию, которая будет выбирать сколько проектов существует на определенную роль, но только (!), Если роль была добавлена ​​в проект в определенном период.

Классический запрос (без даты Rande фильтрации) выглядит следующим образом (и работает хорошо):

{ // ... 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» из-за критерия 'Role 2' AddedAt date.

Таким образом, я считаю, я должен добавить следующее условие где-то дополнительно:

"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": {} 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
Смежные вопросы