加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_阳江站长网 (https://www.0662zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > 模式 > 正文

哇,ElasticSearch多字段权重排序居然可以这么玩

发布时间:2020-08-28 13:55:33 所属栏目:模式 来源:ITPUB
导读:读者提问:ES 的权重排序有没有示列,参考参考? 刚好之前也稍微接触过,于是写了这篇文章,可以简单参考下。 在很多复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的

@Test
public void testSort() {
   String scoreScript = "if (doc['type'].value == 3) {" +
           "   return 100;" +
           "} else {" +
           "   return 1;" +
           "}";
   FunctionScoreQueryBuilder.FilterFunctionBuilder[] filterFunctionBuilders = new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
           new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.matchAllQuery(), ScoreFunctionBuilders.scriptFunction(new Script(scoreScript)))
   };
   SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
   BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
   boolQuery.must(QueryBuilders.termQuery("userId", 1));
   FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(boolQuery, filterFunctionBuilders);
   searchSourceBuilder.query(functionScoreQueryBuilder)
           .sort("_score", SortOrder.DESC)
           .sort("heat", SortOrder.DESC);
   SearchRequest searchRequest = new SearchRequest(elasticSearchIndexConfig.getArticleSearchIndexName());
   searchRequest.types(EsConstant.DEFAULT_TYPE);
   searchRequest.source(searchSourceBuilder);

   List searchResults = kittyRestHighLevelClient.search(searchRequest, ArticleDocument.class);
   searchResults.forEach(doc -> {
       System.out.println(doc.getId() + " " + doc.getType() + " " + doc.getHeat());
   });
}

scoreScript 就是控制权重的脚本,也就是一段代码(脚本默认是 groovy),是不是方便的多。

(编辑:应用网_阳江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读