一、查询结果按某个字段进行排序
{
"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)
小伙伴们,如果有其他的排序方式,欢迎一起讨论。