一、查询结果按某个字段进行排序
{ "size" : 5, "query" : { "bool" : { "filter" : [ { "range" : { "startTime" : { "from" : 1517046960000, "to" : 1517048760000 } } } ] } }, "sort" : [{ "startTime" : { "order" : "desc"}} ] }
//javaApi设置查询数量size和对orderstr进行正序 SearchRequestBuilder srb = this.createSearchRequestBuilder(new Date(begin), new Date(end)); srb.setQuery(queryBuilder).setSize(queryParam.getPageIndex() * queryParam.getPageSize()) .addSort(orderStr, SortOrder.ASC);
二、聚合结果进行排序
1、根据查询到文档数量
聚合结果为查询到文档的数量倒序:"order" : { "_count" : "desc" }
{"size": 0, "query" : { "bool" : { "filter" : [ { "range" : { "startTime" : { "from" : 1515655800000, "to" : 1516865400000 } } }, { "term" : { "type" : { "value" : "URL", "boost" : 1.0 } } } ] } }, "aggregations" : { "CATEGORY" : { "terms" : { "field" : "errorCode", "size" : 5, "order" : { "_count" : "desc" } } } } }
//在java代码中不能直接使用“_count” 使用如下的方式查询 TermsAggregationBuilder termsAggBuilder=AggregationBuilders.terms(AggAlias.CATEGORY.getValue()).field(cateGoryFieldName); termsAggBuilder.order(Terms.Order.count(false)).size(5);
(2)、根据子聚合的结果进行排序
{ "query" : { "bool" : { "filter" : [ { "term" : { "type" : { "value" : "URL", "boost" : 1.0 } } } ] } }, "aggregations" : { "CATEGORY" : { "terms" : { "field" : "name", "size" : 5, "order" : {"responseTime.avg" : "asc" } }, "aggregations" : { "responseTime" : { "extended_stats" : { "field" : "durationInMillis", "sigma" : 2.0 } }, "error" : { "sum" : { "script" : { "inline" : "def errorTemp=doc['status'].value; if(errorTemp=='0'){return 0;}else{return 1;}", "lang" : "painless" } } }, "apdex" : { "avg" : { "script" : { "inline" : "def responseTemp=doc['durationInMillis'].value; if(responseTemp>params.threshold){return 0.5;}else{return 1;}", "lang" : "painless", "params" : { "threshold" : 20.0 } } } }, "errorRate" : { "percentile_ranks" : { "script" : { "inline" : "def errorTemp=doc['status'].value; if(errorTemp=='0'){return 1;}else{return 0;}", "lang" : "painless" }, "values" : [ 0.0 ], "keyed" : true, "tdigest" : { "compression" : 100.0 } } } } } } }
//注意根据上面的语句传入的参数应该是 orderStr===responseTime.avg ascOrder=true AggregationBuilders.terms(AggAlias.CATEGORY.getValue()).field(categoryfieldName).order(Terms.Order.aggregation(orderStr,ascOrder)).size(size)小伙伴们,如果有其他的排序方式,欢迎一起讨论。