Я следующие объекты индексируются:агрегация Упругого поиска усиливается фильтрация для вложенного запроса
{ "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
}
},