ElasticSearch Aggregation Java - вложенный массив объектов - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь написать отчетный запрос для вложенного массива объектов.

Данные выглядят так:

{
    "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")
                        )
                )
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...