es数组内容排序;脚本排序

Posted 好大的月亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es数组内容排序;脚本排序相关的知识,希望对你有一定的参考价值。

需求概述

在已经的查询条件中,需要按照返回结果内容中的一个字段内容倒序排序,一般单个字段的话直接addSort然后排序就ok了。但是我的目标字段是一个数组,需要按照查询内容在字段中是否出现倒序排序。

思路:

  1. 直接将复核条件的数据的score翻倍,按照score排序。(我采用的这种)
  2. 利用sort中的missing _last,将doc中没有这个属性的数据放到最后,有的放到最前。(这个看具体需求)
  3. 使用脚本自定义。(理论上可以,但是未实现)

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命令配置

使用 ES6 和 React 解构和重新排序数组

es6 sort 排序

ES6 set方法对数组去重和排序

shell脚本——数组的应用及排序算法(冒泡直接反转希尔排序)

在NodeJS中按值排序数组