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脚本实现更加复杂的排序,附上链接

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));
}
。
。
。
经验分享 程序员 微信小程序 职场和发展