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

这篇具有很好参考价值的文章主要介绍了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"
    }
  }
}

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

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
{
  
}

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

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、测试结果:

elasticsearch sort script实现字段值等于某值排名靠前文章来源地址https://www.toymoban.com/news/detail-515082.html

到了这里,关于elasticsearch sort script实现字段值等于某值排名靠前的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch 8.X 如何优雅的实现字段名称批量修改?

    写入es前,数据格式如下 需求:单纯用pipeline可不可以实现,如果写入key包含json_提换为空,包含tmp提换为core,因为key字段有很多不考虑穷举,最终效果要如下: ——问题来源:死磕Elasticsearch知识星球 https://t.zsxq.com/0bzWL3w1X Elasticsearch mapping 一旦创建是不允许修改的!允许更

    2023年04月09日
    浏览(35)
  • Elasticsearch按某个字段去重-实现group by效果

    已知es中存储了一张学生课程信息宽表,里边包含有student_name、student_id、teacher_id、课程信息等字段。 现在根据学生姓名或者班级ID,得出学生所在班级的所有授课教师信息。  既然是明细宽表,里边的教师的信息必然是有重复的,因此我们需要查询teacher_id的集合并去重,对

    2024年02月12日
    浏览(43)
  • JDK8的lambda方式List多字段排序List.stream().sorted()

    JDK8的lambda方式List多字段排序List.stream().sorted() 多字段排序 拼音排序: 引入jar包: 自定义比较器: 结束。

    2024年02月10日
    浏览(50)
  • elasticsearch实现根据某一个字段去重后并求总数

    版本说明: elasticsearch:elasticsearch-7.12.1 kibana:kibana-7.12.1-windows-x86_64 原始数据: _index _type _id _score address age bir id name jason_doc_10 _doc L2aqNoABfXKo_Zq7BPkO 1 中国深圳 69 1650184553376 daZhaoLiu 大赵六 jason_doc_10 _doc MGaqNoABfXKo_Zq7mfma 1 中国上海市宝山区 20 1649862303342 user001 大张三 jason_doc_10

    2023年04月08日
    浏览(32)
  • 当es使用script脚本查询聚合等操作遇到空字段报错问题解决方案

            在使用ES的脚本时,如果脚本中引用了不存在或者空的字段,则会导致脚本执行失败并抛出错误。这是因为ES会在脚本执行之前尝试检索引用的字段,如果该字段不存在则会抛出异常。         因此,在使用ES脚本时,需要确保所引用的字段都存在且不为空。可

    2024年02月11日
    浏览(50)
  • Elasticsearch实现对同一字段既能精准查询也能模糊查询

     使用@MultiField注解给字段取别名并设置为keyword类型 dao层如下 实体类如下 模糊查询测试如下: 可以看到模糊查询content中一共有3条数据有我这个分词  精准查询如下:  可以看到精准查询就只有一条结果,符合精准查询。 注意:该方法需要版本支持,具体版本未知,但是在

    2024年02月02日
    浏览(45)
  • elasticsearch结果窗口限制10000[from+size小于或等于10000]

    Elasicsearch版本7.8,执行DSL查询 结果Elasicsearch报如下错误 其实Elasicsearch这个错误已经提示的很明显了,甚至提出了解决方案。大概意思是说:结果窗口太大,from+size必须小于或等于10000,但我们检索的DSL中from+size=10001。我们在查询大量数据时可以采用 scroll api 这种高效的方式。

    2024年02月16日
    浏览(35)
  • JAVA前端bootstrap-table表格,全量查数据后也能字段点击排序sort

    工程后期改造,加了一层首页展示,该层无需分页所以想在代码层次实现排序,而不是数据库sql  

    2024年02月17日
    浏览(52)
  • elasticsearch index sorting ,索引排序

    es默认的搜索排序是_score,通过评分排序,但是对于大数据量,评分一致的情况下也还是会乱序,官方说可以使用_doc,但是这个索引插入顺序是按照分片存的,也就是为2 的顺序可能多个分片都存在。所以实测并不好用。博主在做大数据量的排序时候,使用 datatime字段排序 ,解

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包