elasticsearch sort script实现字段值等于某值排名靠前

什么是script语言
script语言是es提供的一种支持自定义编程的用于复杂查询的脚本语言,主要类型有painless、expressions等。

需求描述
实际业务场景需要将某字段等于某值的排在前面,其他数据靠后。
比如:
雇员属性:name-名称,price-价值
价值 == 100的雇员排名在前,其他数据按照价值倒序排名。

技术简介
根据需求我们可以用es的script语法,在script里面进行表达式解析,最后进行排序。

案例实战
为保证测试用例以及es语法可见,我们用kibana进行脚本演示

1、创建雇员索引

PUT employ
PUT employ/_mapping
{
  "properties":{
    "name":{
      "type":"keyword"
    },
    "price":{
      "type":"long"
    }
  }
}

在这里插入图片描述

2、新增雇员测试数据

#雇员数据
PUT employ/_doc/1
{
  "name":"zhangsan",
  "price":123
}

PUT employ/_doc/2
{
  "name":"lisi",
  "price":315
}

PUT employ/_doc/3
{
  "name":"wangwu",
  "price":100
}

3、查询测试数据

GET employ/_search
{
  
}

在这里插入图片描述

4、运用es sort script语法进行查询
表达式:价值 == 100 的数据排在最前面,然后根据价值倒序进行其他数据排序。

#价值为100的排在前面,后面的按照价值倒序
#如果表达式比较时间则需要转化 .value.toInstant().toEpochMilli()
#如果表达式比较字符也需要转换 .value.toString()
#也就是说表达式两端的类型要一致,如果比较long型数据最好用字符串进行比较
GET employ/_search
{
  "query": {
    "bool": {
      
    }
  },
  "sort": [
    {
      "_script":{
        "script":{
          "source": "doc['price'].value == 100 ? 1 : 0"
        },
        "type":"number",
        "order": "desc"
      }
    },{
      "price":{
        "order": "desc"
      }
    }
  ]
}

5、测试结果:

在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小沈同学呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值