如何在弹性查询的单个响应中存储多个api响应

时间:2019-04-25 11:45:50

标签: elasticsearch multi-query

我正在基于no进行查询优化。天,因此如果有30天的单个查询,那么我需要将每个10天的单个查询拆分为[1-10],[11-20],[21-30]。 我已经完成的工作:使用map和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,字符串queryPath,QueryBuilder查询,                                                                    列表聚合,字符串metricName,布尔addPrefix = true,                                                                    int numFilteredTGMembers = 0){         列表响应= new ArrayList <>();         字符串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
}

请让我知道我可以在此处将多个响应汇总或整合为单个响应。

0 个答案:

没有答案