elasticsearch实现简单的脚本排序(script sort)

news2025/4/26 21:19:16

文章目录

  • 1、背景
  • 2、分析
  • 3、构建数据
    • 3.1 mapping
    • 3.2 插入数据
  • 4、实现
    • 4.1 根据省升序排序
      • 4.1.1 dsl
      • 4.1.2 运行结果
    • 4.2 湖北省排第一
      • 4.2.1 dsl
      • 4.2.2 运行结果
    • 4.3 湖北省排第一,其余省升序排序,按照年龄倒序
      • 4.3.1 dsl
      • 4.3.2 java代码
      • 4.3.3 运行结果
  • 5、完整代码
  • 6、参考文档

1、背景

我有一堆学生数据,其中湖北省的学生需要排在所有数据的最前面。其余省正序排序,对于同一个省的数据,按照年龄倒序排序。

2、分析

对于上方的排序需求湖北省的学生数据需要排在前端,但是湖北省并不是一个字段,那么这个时候改如何实现呢?对于这种场景我们很容易就想到需要脚本script sort来实现。

3、构建数据

3.1 mapping

PUT /index_person
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "id":{
        "type": "long"
      },
      "name": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      },
      "province":{
        "type": "keyword"
      }
    }
  }
}

3.2 插入数据

PUT /index_person/_bulk
{"index":{"_id":1}}
{"id":1, "name":"张三","age":18,"province":"湖北"}
{"index":{"_id":2}}
{"id":2, "name":"李四","age":19,"province":"湖北"}
{"index":{"_id":3}}
{"id":3, "name":"王武","age":20,"province":"西安"}
{"index":{"_id":4}}
{"id":4, "name":"赵六","age":21,"province":"西安"}
{"index":{"_id":5}}
{"id":5, "name":"钱七","age":22,"province":"上海"}

4、实现

4.1 根据省升序排序

4.1.1 dsl

GET index_person/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "province": {
        "order": "asc"
      }
    }
  ]
}

4.1.2 运行结果

运行结果
可以看到省升序的排序顺序为 上海、湖北、西安

4.2 湖北省排第一

4.2.1 dsl

GET index_person/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_script": {
        "type": "number",
        "order": "desc",
        "script": {
          "lang": "painless",
          "source": """
                      if(params['_source']['province'] == '湖北'){
                        1
                      } else {
                        0
                      }
                    """
        }
      }
    }
  ]
}

4.2.2 运行结果

运行结果
通过如上的 script sort排序之后,就可以看到 湖北省已经是排到第一位了。

4.3 湖北省排第一,其余省升序排序,按照年龄倒序

4.3.1 dsl

GET index_person/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_script": {
        "type": "number",
        "order": "desc",
        "script": {
          "lang": "painless",
          "source": """
                      if(params['_source']['province'] == '湖北'){
                        1
                      } else {
                        0
                      }
                    """
        }
      }
    },
    {
      "province": {
        "order": "asc"
      },
      "age": {
        "order": "desc",
        "missing": "_last"
      }
    }
  ]
}

4.3.2 java代码

@Test
@DisplayName("脚本排序,固定的某个值的数据排在前面,其余的数据按照别的字段排序")
public void test01() throws IOException {
    SearchRequest request = SearchRequest.of(searchRequest ->
            searchRequest.index("index_person")
                    .query(query -> query.matchAll(matchAll -> matchAll))
                    .size(100)
                    .sort(sort ->
                            sort.script(sortScript ->
                                    sortScript.type(ScriptSortType.Number)
                                            .order(SortOrder.Desc)
                                            .script(script ->
                                                    script.inline(inline ->
                                                            inline.source("if(params['_source']['province'] == params.province){\n" +
                                                                            "                        1\n" +
                                                                            "                      } else {\n" +
                                                                            "                        0\n" +
                                                                            "                      }")
                                                                    .params("province", JsonData.of("湖北"))
                                                    )
                                            )
                            )
                    )
                    .sort(sort ->
                            sort.field(field ->
                                    field.field("province").order(SortOrder.Asc)
                            )
                    )
                    .sort(sort ->
                            sort.field(field ->
                                    field.field("age").order(SortOrder.Desc).missing("_last")
                            )
                    )
    );

    System.out.println("request: " + request);
    SearchResponse<Object> response = client.search(request, Object.class);
    System.out.println("response: " + response);
}

4.3.3 运行结果

运行结果

5、完整代码

1、https://gitee.com/huan1993/spring-cloud-parent/blob/master/es/es8-api/src/main/java/com/huan/es8/script/ScriptFieldSort.java

6、参考文档

1、https://www.elastic.co/guide/en/elasticsearch/reference/7.17/sort-search-results.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自学Python】Python逻辑运算符

Python逻辑运算符 Python逻辑运算符教程 在 Python 中&#xff0c;逻辑运算符用于连接多个条件&#xff08;一般来讲就是关系表达式&#xff09;&#xff0c;最终的结果是一个 bool 值。Python 的逻辑运算符主要包括 and&#xff08;逻辑与&#xff09;、or&#xff08;逻辑或…

ArcGIS基础实验操作100例--实验88按距离分配空间

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验88 按距离分配空间 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&am…

[白嫖]利用百度图片缓存规则作为图床

利用百度图片缓存规则作为图床先看一张图片&#xff1a;这张图片引用了百度的图片服务器&#xff1a;https://gimg2.baidu.com/image_search/srcpicx.zhimg.com/v2-a6f0db9230a0e4b67e70524217e009fe_1440w.jpg&app2020但实际上这张图片的源站在知乎&#xff1a;https://pi…

Nginx与LUA(2)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;除了反向代理&#xff0c;Nginx另一个主要的功能就是「负载均衡」。所谓负载均衡&#xff0c;就是将请求分摊到多个服务器上执行&#xff0c;从而减轻单台服务器的…

使用 ADManager Plus 管理Microsoft 365许可证

作为 Microsoft 365 管理员&#xff0c;管理用户的 Microsoft 365 许可证&#xff0c;为新员工分配适当的 Microsoft 365 许可证&#xff0c;在员工离开组织时释放 Microsoft 365 许可证&#xff0c;以及将释放的许可证重新分配给其他用户&#xff0c;构成了日常活动的重要组成…

YGG 在 Branch.gg 的免费游戏 Castaways 中购买了 Genesis NFT

YGG 在 Branch.gg 的第一款免费 web3 游戏 Castaways 中购买了 NFT 资产。Branch.gg 是一家开发开放世界沙盒大型多人在线游戏&#xff08;MMO&#xff09;的游戏初创公司&#xff0c;玩家通过合作来确保他们的生存。 在公开市场购买时&#xff0c;YGG 已经获得了 1,000 个 Cas…

ShareSDK 常见问题

QQ-分享报错901111&#xff0c;9001010等 由于QQ现在需要审核后才可以分享&#xff08;之前分享不需要审核&#xff09;&#xff0c;所以此错误解决方法只需通过腾讯开放平台的审核即可&#xff0c;另外要检查注册好的应用的基本信息&#xff0c;包名、md5签名和Bundle id是不…

上半年要完成的博客50

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

C++ 优先级队列的vector实现

前段时间在研究Astar算法&#xff0c;里面涉及到几个重要的知识点&#xff0c;链表数据结构、优先队列数据结构&#xff0c;在以前的工作中没有接触到&#xff0c;学习后发现真是好东西&#xff0c;对C的认知更深了一步&#xff0c;不废话了&#xff0c;下面正文&#xff1a; …

【正点原子FPGA连载】第十一章U-Boot使用实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十一章U-Boot使…

ESP32接入米家-小爱同学-IDF环境-巴法平台

0 引言 冬天床边没有开关&#xff0c;睡觉懒得关灯&#xff0c;想通过小爱同学控制灯的开关&#xff0c;但是不想换开关。 所以 想用ESP32接入米家&#xff0c;控制一个舵机实现开关控制。 文章目录0 引言1 MQTT协议2 ESP32 MQTT例程2.1 ESP-MQTT 库2.2.1 配置结构体 esp_mqt…

【Python基础】字符串基本操作(切片、格式化、编码)

文章目录一. 字符串1.1 字符串切片操作1.2 格式化字符串1.2.1 内容填充1.2.2 宽度精度1.3 编码解码一. 字符串 1.1 字符串切片操作 字符串是不可变类型 不具备增、删、改操作切片操作将产生新的对象&#xff0c;但如果是相同的字符串&#xff0c;对象不变。 操作格式&#xf…

③电子产品拆解分析-充电宝台灯

③电子产品拆解分析-充电宝台灯一、功能介绍二、电路分析以及器件作用1、TP4056锂电池充电电路分析2、锂电池保护电路分析3、台灯灯光控制电路一、功能介绍 ①可进行两档调光&#xff1b;②长按按键可显示电池电量&#xff1b;③可进行Macio USB安卓接口充电以及USB接口输出放…

【图文教程】云服务器上,Linux安装VSFTPD组件及遇到的问题

服务器做迁移&#xff0c;从AXX云迁移到Txx云上&#xff0c;迁移的话&#xff0c;需要把图片服务器也迁移过去。之前使用的是VSFTPD这次也还用这个吧。这里就记录下FTP服务器安装及遇到的问题。 1&#xff1a;安装VSFTP组件 使用yum命令安装。安装命令如下: yum -y install …

Ubuntu18.04 利用Systemback制作ISO系统镜像和还原

Ubuntu18.04 利用Systemback制作系统镜像和还原1、安装Systemback2、利用Systemback制作Live镜像3、 将大于4G的sblive文件转换成 ISO 文件&#xff08;Systemback的界面中的转换选项不可用的情况&#xff09;4、利用Systemback还原系统&#xff08;利用Systemback还原系统出现…

一文详解 Linux Crontab 调度任务

最近接到这样一个任务&#xff1a; 定期(每天、每月)向“特定服务器”传输“软件服务”的运营数据&#xff0c;因此这里涉及到一个定时任务&#xff0c;计划使用Python语言添加Crontab依赖写一个定时任务的脚本&#xff0c;实现每天、每月向服务器上传运营数据。 这篇文章是我在…

界面控件DevExpress WPF中文指南 - 用主题设计器的后台视图升级主题

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。DevExpress WPF的Theme…

Chevereto v4 专业版搭建个人图床图文教程(博主自用)

Chevereto 是一个优秀的图床程序&#xff0c;有免费版和付费版之分&#xff0c;目前&#xff0c;Chevereto 已更新至 V4 版本&#xff0c;今天为大家分享一下使用 Chevereto v4 最新专业版搭建个人图床的过程。1. 准备工作PHP 版本要求 8.0 及以上&#xff0c;MySQL 版本支持 5…

.net5项目集成百度富文本编辑器umeditor最全教程(含源码)

目前百度的umeditor已经停止维护了&#xff0c;net版本的分支源码包也停留在了net farmework4左右的版本&#xff0c;对于想要集成这款富文本编辑器到net5平台&#xff0c;具有较大难度&#xff0c;主要体现在以下几个方面&#xff1a;umeditor源码需要改造&#xff0c;需要具有…

【每日随笔】北京 MBA 学校选择

文章目录一、第一梯队二、第二梯队三、第三梯队四、MBA 的全日制和非全日制区别一、第一梯队 第一梯队 MBA : 招人非常严格 , 本科学历背景 , 薪资 , 工作年限 , 管理年限 , 要求很高 ; 二、第二梯队 第二梯队 MBA : 对外经贸大学 MBA 推荐 对外贸易 相关行业 , 对英语要求较高…