Я пытаюсь написать отчетный запрос для вложенного массива объектов.
Данные выглядят так:
{
"payment": {
"transactions": [
{
"amount": "200",
"paymentDate": "2018-09-12T00:00:00.000Z",
"transactionType": "D"
},
...,
{...}
]
}
}
Суть моего запроса приведена ниже и выполняется без ошибок, однако результаты агрегации включают транзакции, которые находятся за пределами paymentDate, указанного в запросе. Я понимаю, что запрос возвращает документ, который соответствует указанным критериям, и поэтому имеет смысл, что агрегация не является должным образом «отфильтрованной» - есть ли способ убедиться, что моя агрегация включает только транзакции, которые попадают в указанную paymentDate?
SearchRequestBuilder searchRequestBuilder = esClient
.getClient()
.prepareSearch(PRODUCT_INDEX)
.setIndices(INDEX)
.setQuery(
boolQuery()
.must(
nestedQuery(
path,
boolQuery()
.must(termQuery("payment.transactions.transactionType", "D"))
.must(rangeQuery("payment.transaction.paymentDate").from(begin.getTime()).to(end.getTime())),
ScoreMode.Max
)
)
)
.addAggregation(
AggregationBuilders
.nested("agg", path)
.subAggregation(
AggregationBuilders
.sum("Report")
.field(String.format("payment.transaction.amount", path))
)
)
.storedFields(SEARCH_FIELDS)
.setSize(10000)
.setScroll(new TimeValue(600000));
РЕДАКТИРОВАТЬ Решено:
Добавление фильтрации субагрегации по дате поверх моих фильтров агрегации суммы по дате соответственно
...
.addAggregation(
AggregationBuilders
.nested("agg", path)
.subAggregation(
AggregationBuilders
.filter("date", boolQuery().must(rangeQuery("payment.transaction.paymentDate").from(begin.getTime()).to(end.getTime())))
.subAggregation(
AggregationBuilders
.sum("Report")
.field("payment.transaction.amount")
)
)
)