我正在基于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
}
请让我知道我可以在此处将多个响应汇总或整合为单个响应。