需求概述
在已经的查询条件中,需要按照返回结果内容中的一个字段内容倒序排序,一般单个字段的话直接addSort
然后排序就ok
了。但是我的目标字段是一个数组,需要按照查询内容在字段中是否出现倒序排序。
思路:
- 直接将复核条件的数据的
score
翻倍,按照score
排序。(我采用的这种) - 利用
sort
中的missing _last
,将doc中没有这个属性的数据放到最后,有的放到最前。(这个看具体需求) - 使用脚本自定义。(理论上可以,但是未实现)
sort missing _last实现
这里我使用的是6.3的es
,目标字段categories
是数组
先在kibana
中使用rest api
查询,是否和结果一致
使用java api
实现
SearchRequestBuilder resultRequestBuilder = createRequestBuliderByESIndex(SHOP_INDEX,searchParam.getPageSize(),searchParam.getPageNo());
BoolQueryBuilder finalQueryBuilders = QueryBuilders.boolQuery();
.
.
.
finalQueryBuilders.should(QueryBuilders.termQuery("categories",searchParam.getCategoryId()));
FieldSortBuilder categorySort = SortBuilders.fieldSort("categories");
categorySort.missing("_last");
resultRequestBuilder.addSort(categorySort);
另外在Stack Overflow
中查询到还可以用script
脚本实现更加复杂的排序,附上链接文章来源:https://www.toymoban.com/news/detail-507153.html
https://stackoverflow.com/questions/47295552/elasticsearch-sorting-by-array-column文章来源地址https://www.toymoban.com/news/detail-507153.html
POST my_index/my_type/_search
{
"sort" : {
"_script" : {
"script" : "String s = ''; for(int i = 0; i < params._source.my_array.length; ++i) {s += params._source.my_array[i] + ','} s",
"type" : "string",
"order" : "asc"
}
}
}
增加score实现
SearchRequestBuilder resultRequestBuilder = createRequestBuliderByESIndex(SHOP_INDEX, searchParam.getPageSize(), searchParam.getPageNo());
BoolQueryBuilder finalQueryBuilders = QueryBuilders.boolQuery();
。
。
。
if(StringUtils.isNotBlank(searchParam.getPackageId())){
finalQueryBuilders.should(QueryBuilders.termQuery("lightUpPackageIds", searchParam.getPackageId()).boost(10f));
}
。
。
。
到了这里,关于es数组内容排序;脚本排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!