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

37 篇文章 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

es修改排序_ElasticSearch自定义排序(转载)
weixin_34698515的博客
02-23 2382
本文讨论ES的自定义排序的两种实现形式:基于groovy脚本的自定义排序和基于native script的自定义排序。1. 基于Groovy脚本的自定义排序ES排序脚本必须放在config/scripts下面,ES能够自动发现这些脚本并提供对外使用, 例如编写脚本calculate-score.groovylog(_score*2)+my_modifier脚本中my_modifier是搜索请求中...
Elasticsearch:如何基于Script实现按照text属性值的字符串长度排序
2401_83916326的博客
04-14 621
数组情形下,既然我们可以通过或者获取字段长度,那么需要修改mappings该属性的类型;字符串情形下,,但是需要注意,如果的值存在为null的情况,需要使用优先判空。最终的脚本为:“from”: 0,“query”: {“terms”: {“id”: [“66108”,“72221”},“sort”: [},},三、踩坑历史什么是ActiveMQ?ActiveMQ服务器宕机怎么办?丢消息怎么办?持久化消息非常慢怎么办?消息的不均匀消费怎么办?死信队列怎么办?
es数组内容排序脚本排序
奔跑的菜鸡
08-17 1676
es数组内容排序
sort-script:elasticsearch排序脚本
04-07
排序脚本 SortScriptElasticSearch的本机插件,用于实现自定义排名算法。
Elasticsearch 排序机制详解
最新发布
一起coding,一起嗨。
08-12 567
Elasticsearch 排序机制详解
elecsearch java入门_java操作elecsearch
weixin_34463209的博客
02-25 468
importorg.elasticsearch.action.bulk.BulkRequestBuilder;importorg.elasticsearch.action.bulk.BulkResponse;importorg.elasticsearch.action.get.GetRequestBuilder;importorg.elasticsearch.action.get.GetRespo...
ElasticSearch 评分排序
dengzai7446的博客
02-23 1028
背景 通过脚本改变评分 背景 近期有一个需求,需要对优惠券可用商品列表加个排序,只针对面值类的券不包括折扣券。 需求是这样的,假设有一张面值券 50 块钱,可用商品列表 A 100、B 40、C 10,当用户查询当前券可用商品列表的时候优先将卡券可以直接抵扣且不需要用户在额外支付的商品排在前面。 C 10 B 40 A 100 其实排序有很多侧重,比如: 1.根据用户利益最大化...
elasticsearch 脚本排序
oBoySen的专栏
08-11 2209
elasticsearch 脚本排序主要用于复杂场景的综合排序脚本语言有 java ,painless,groovy,目前调研的为painless。 kibana 脚本创建mapping DELETE ksc.metadata PUT ksc.metadata { "mappings": { "doc": { "properties": { "h...
Elasticsearch 自定义排序脚本
jonssonyan
07-01 1040
按照rooms字段的数组长度排序 { "query": {}, "sort": [ { "_script":{ "script":{ "inline": "doc['rooms'].values.size()" }, "type":"number", "order": "desc" } } ] } Java API Script script = new Script("
Elasticsearch使用篇 - 查询排序
The Secret
02-09 2848
本文介绍Elasticsearch的查询排序
es多个字段排序_ElasticSearch字段权重排序居然可以这么玩
weixin_39613744的博客
02-15 2699
刚好之前也稍微接触过,于是写了这篇文章,可以简单参考下。在很多复杂的业务场景下,排序的规则会比较复杂,单一的降序,升序无法满足日常需求。不过 ES 中提供了给文档加权重的方式来排序,还是挺好用的。首先初始化三条测试数据,方便查看效果:{id: 1,title: "Java怎么学",type: 3,userId: 1,tags: ["java"],textContent: "我要学Java",sta...
Elasticsearch:对搜索结果排序 - Sort
Elastic 中国社区官方博客
06-29 7018
​ 我们知道在默认的情况下,搜索的结果是按照相关性来进行排序的。分数最高的排在前面,而分数低的向后依次排序。在绝大多数的情况下,这种排序是非常有效的,而且也适用我们的很多用例。即便针对分数,我们也可以对搜索的结果进行定制。关于这个分数是如何及算出来的,你可以参考我之前的文章 “Elasticsearch:使用 Elasticsearch 提高网站搜索查询的相关性”。我们也可以使用一下方法来定制我们的分数。你可以阅读如下的文章: ​.........
elasticsearch sort script实现字段值等于某值排名靠前
勤于笔记,成于点滴。
10-11 2170
根据需求我们可以用esscript语法,在script里面进行表达式解析,最后进行排序
Elasticsearch自定义脚本排序
gaozhanming_sir的博客
11-26 8988
具体脚本语法搜索“Groovy”语法 GET m_cyber_es_account/account/_search { "query": { "term": { "site_type_id": { "value": "2" } } }, "sort": [ { "_script&quot
elasticsearch-基于多字段,字符串内部排序
豆豆不在了
02-15 3999
字符串排序与多字段 被解析的字符串字段也是多值字段, 但是很少会按照你想要的方式进行排序。如果你想分析一个字符串,如 fine old art , 这包含 3 项。我们很可能想要按第一项的字母排序,然后按第二项的字母排序,诸如此类,但是 Elasticsearch排序过程中没有这样的信息。 你可以使用 min 和 max 排序模式(默认是 min ),但是这会导致排序以 a
elasticsearch _scripts 自定义排序
yys3155的专栏
03-06 1562
GET _search { "query": { "bool": { "should": [ { "query_string": { "default_field": "name", "query": "/[a-z]*/" ...
JavaScriptsort()函数
wangshiqi666的博客
04-28 8480
sort()函数
Elasticsearch中如何进行排序
u012618599的专栏
03-21 6489
背景 最近去兄弟部门的新自定义查询项目组搬砖,项目使用Elasticsearch进行数据的检索和查询。每一个查询页面都需要根据选择的字段进行排序,以为是一个比较简单的需求,其实实现起来还是比较复杂的。这里进行一个总结,加深一下记忆。 前置知识 Elasticsearch是什么? Elasticsearch 简称ES,是一个全文搜索引擎,可以实现类似百度搜索的功能。但她不仅仅能进行全文检索,还可以实现PB级数据的近实时分析和精确查找,还可以作GIS数据库,进行AI机器学习,功能非常强大。
ElasticSearch 实战:ElasticSearch查询排序
qq_33240556的博客
04-01 973
Elasticsearch 实战:Elasticsearch 查询排序Elasticsearch 中,查询排序Sorting)功能允许您按照指定字段的值对查询结果进行升序或降序排列。这有助于用户更直观地查看与查询条件最相关的文档。
elasticsearchscript脚本中使用if排序
06-03
ElasticsearchScript脚本中使用if语句进行排序,可以使用Painless脚本语言来实现。以下是一个示例: ``` GET /my_index/_search { "query": { ... }, "sort": { "_script": { "type": "number", "script": { "lang": "painless", "source": "if (doc['my_field'].value > 0) { return doc['my_field'].value } else { return 0 }", }, "order": "desc" } } } ``` 在上面的示例中,我们使用_script排序来对文档进行排序。在排序脚本中,我们使用if语句来判断my_field字段的值是否大于0。如果是,我们返回my_field字段的值;如果不是,我们返回0。最后,我们按降序排列结果。 需要注意的是,使用if语句可能会影响查询性能,因此要谨慎使用。另外,Painless脚本语言有其自己的语法规则和限制,需要仔细阅读文档并进行测试。
写文章

分类专栏

  • spring cloud 入门 33篇
  • 网络-监控-告警 16篇
  • 前端 1篇
  • flink学习 2篇
  • 配置中心 2篇
  • project reactor 1篇
  • activiti工作流学习 2篇
  • 模板引擎 1篇
  • linux 6篇
  • websocket 3篇
  • mybatis&canal&seata 16篇
  • 数据库 5篇
  • spring session
  • redis 7篇
  • spring 11篇
  • springboot 31篇
  • poi 3篇
  • spring data jpa 2篇
  • 消息队列 7篇
  • rabbitmq 11篇
  • elk 37篇
  • vuex 1篇
  • mongodb学习 6篇
  • spring security 10篇
  • java基础 12篇
  • netty 4篇
  • freemarker 1篇
  • protostuff 3篇
  • jsonPath 1篇
  • 第三方登录 1篇
  • jwt 1篇
  • 图表 1篇
  • spring social 2篇
  • nginx 1篇
  • git 3篇
  • spring cloud小记 15篇
  • 微信开发 5篇
  • hadoop 14篇
  • lua 2篇
  • drools 16篇
  • fastdfs 4篇
  • docker学习 8篇

最新评论

  • drools动态增加、修改、删除规则

    Braveyouth: 大佬牛表情包

  • drools动态增加、修改、删除规则

    huan_1993: 你可以看我gitee上的代码,这个问题我貌似解决了。 博客下方有gitee的代码地址。

  • drools动态增加、修改、删除规则

    Braveyouth: 执行删除后重新添加新的,再调用fire接口规则不生效了

  • mysql的运维操作

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)增加除了各种控件外,文章正文的字数;(2)提升标题与正文的相关性。

  • Spring Authorization Server的使用

    shine4j: 大师,非常感谢你的帮助,讲的非常的好,太感谢了。

最新文章

  • 在Java程序中监听mysql的binlog
  • 记录一些简单的linux运维命令
  • Nacos单机模式下,SpringCloud程序注册到nacos上,报server is DOWN now, please try again later的解决方法
2024年4篇
2023年28篇
2022年40篇
2021年73篇
2020年17篇
2019年15篇
2018年49篇
2017年24篇
2016年9篇
2015年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司站群怎么优化网站网站关键词优化效果图榕江县网站优化营销城区网站优化推广排名品牌江苏网站推广优化郑州路普网站制作网站优化公司金融城网站优化福建网站优化技术网站优化公司的口号宁波哪有网站优化代理十堰网站关键词优化兰溪高端百度网站优化武汉网站seo优化公司佛山网站的关键词优化龙华网站优化排名电话推荐销售行业网站优化价格怀化专业网站优化哪家好百度快照是网站优化吗手机上的网站优化兰州网站整站优化方式鄢陵全网网站优化产品介绍省心的服装行业网站优化平台商丘外贸网站优化价格表网站优化关键词数量环保设备网站seo优化渠道网站优化排名工具网站快速优化推广济源鹤壁网站优化信丰网站百度优化网站外链优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化