es数组内容排序;脚本排序
Posted 好大的月亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es数组内容排序;脚本排序相关的知识,希望对你有一定的参考价值。
需求概述
在已经的查询条件中,需要按照返回结果内容中的一个字段内容倒序排序,一般单个字段的话直接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://stackoverflow.com/questions/47295552/elasticsearch-sorting-by-array-column
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数组内容排序;脚本排序的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本——sortuniqtr数组排序cuteval命令配置