Как сохранить несколько ответов API в одном ответе эластичных запросов - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю над оптимизацией запросов на основе нет. дней, поэтому, если есть один запрос на 30 дней, мне нужно разделить этот единственный запрос на 10 дней, как для [1-10], [11-20], [21-30]. что я сделал: используя карту и RangeQueryBuilder. код для генерации запроса if(dateRangeMap.size() > 0) { for(Map.Entry<Integer, Integer> it : dateRangeMap.entrySet()) { query = generateQuery(chartRequest.filters, it.getKey(), it.getValue());

и вот метод генерации запроса

    static BoolQueryBuilder generateQuery(List<FilterGroup> filters, int key, int value) {

    BoolQueryBuilder boolQueryBuilder = boolQuery().minimumNumberShouldMatch(1)
            .should(dateRangeFilter('tracking.last_found', key, value))
            .should(dateRangeFilter('tracking.last_fixed', key, value))
            .should(boolQuery()
                    .filter(dateRangeFilter('scan.started_at', key, value))
                    .mustNot(existsQuery('tracking')))

    generateQuery(filters).filter(boolQueryBuilder)
}

на что это похоже, он генерирует три разных запроса одновременно. в соответствии с приведенным выше кодом первое значение ключа генерирует запрос и дает ответ, затем второе и далее, так что я получил три ответа в списке из трех разных запросов, которые назначены в одной переменной.

Мне нужно объединить эти три ответа в один ответ, вот код, в котором я генерирую ответ для запроса.

статический список queryEsList (ElasticsearchClient esClient, String queryPath, QueryBuilder query, Список агрегатов, String metricName, логическое addPrefix = true, int numFilteredTGMembers = 0) { List response = new ArrayList <> (); String aggString = aggregations.collect {XContentHelper.toString (it) [1 ..- 2]} .join (",")

    SearchSourceBuilder search = new SearchSourceBuilder()
            .size(0)
            .query(query)
            .aggregations("{$aggString}".bytes)
    log.debug("elasticsearch_search ${queryPath}=${search}")
    ElasticsearchQueryResponse res = esClient.performQuery(queryPath, search, mapTypeReference, addPrefix, metricName)
    response << res
    log.info("es query filtering on ${numFilteredTGMembers} target group members took ${res.took} ms ")

    return response
}

Пожалуйста, дайте мне знать, что я могу сделать здесь, чтобы объединить или объединить множественные ответы в одном ответе.

...