需求概述

在已经的查询条件中,需要按照返回结果内容中的一个字段内容倒序排序,一般单个字段的话直接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));
}
。
。
。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐