ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序

这篇具有很好参考价值的文章主要介绍了ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、问题描述

一位学生问我一个问题,实现es查询:对于查询的结果要分成两类【过期和没过期,按照过期时间判断】。没过期的排在前面,过期的排在后面。最后,不管是过期的还是没过期的,在组内都再按照标定时间字段进行倒排序。

是否过期通过过期时间字段进行判断。
es查询时间大于,Elastic Stack,elasticsearch,大数据,搜索引擎

2、误区

对于此类需求,要对一个不存在的字段进行操作,第一应该想到的就是script_fields

一开始思路是这样的,伪代码如下:

GET <index>/_search
{
  "script_fields": {
    "是否逾期": {
      "script": {
          "lang": "painless",
          "source": """
              if(逾期=true) {
                return 1;
              }else{
                return 0;
              }
          """
      }
    }
  }, 
  "sort": [
    {
      "是否逾期": {
        "order": "desc"
      }
    },
    {
      "标定时间":{
        "order": "desc"
      }
    }
  ]
}

3、解决方案

上面方案后发现排序在外部无法对script_field进行调用。于是对script做出修改,把脚本查询写在sort内部。基于product索引模拟的案例如下:

这里假设product索引中 价格> 3000 的类比上述案例中逾期,小于等于 3000 的类比上述案例中未逾期,然后按照价格(类比于标定日期)进行排序(product索引数据在文末体现)

代码如下:文章来源地址https://www.toymoban.com/news/detail-558806.html

# 先根据价格级别(不存在字段)排序,大于3000的排上面,小于等于3000的排下面
# 其次按照价格倒叙排序
GET product/_search
{
  "sort": [
    {
      "_script": {
        "script": {
          "lang": "painless",
          "source": """
              if(params['_source']['price']>3000) {
                return 1;
              }else{
                return 0;
              }
            """
        },
        "type": "number",
        "order": "desc"
      }
    },
    {
      "price": {
        "order": "desc"
      }
    }
  ]
}

4、附:Product索引数据

```json
PUT /product/_doc/1
{
    "name" : "xiaomi phone",
    "desc" :  "shouji zhong de zhandouji",
    "price" :  3999,
    "lv":"qijianji",
    "type":"phone",
    "createtime":"2020-10-01T08:00:00Z",
    "tags": [ "xingjiabi", "fashao","buka" ]
}
PUT /product/_doc/2
{
    "name" : "xiaomi nfc phone",
    "desc" :  "zhichi quangongneng nfc,shouji zhong de jianjiji",
    "price" :  4999,
    "lv":"qijianji",
    "type":"phone",
    "createtime":"2020-05-21T08:00:00Z",
    "tags": [ "xingjiabi", "fashao","gongjiaoka" ]
}
PUT /product/_doc/3
{
    "name" : "nfc phone",
    "desc" :  "shouji zhong de hongzhaji ",
    "price" :  2999,
    "lv":"gaoduanji",
    "type":"phone",
    "createtime":"2020-06-20",
    "tags": [ "xingjiabi", "fashao", "menjinka" ]
}
PUT /product/_doc/4
{
    "name" : "xiaomi erji",
    "desc" :  "erji zhong de huangmenji",
    "price" :  999,
    "lv":"baiyuanji",
    "type":"erji",
    "createtime":"2020-06-23",
    "tags": [ "low", "bufangshui","yinzhicha" ]
}
PUT /product/_doc/5
{
    "name" : "hongmi erji",
    "desc" :  "erji zhong de kendeji nfc",
    "price" :  399,
    "type":"erji",
    "lv":"baiyuanji",
    "createtime":"2020-07-20",
    "tags": [ "lowbee","xuhangduan", "zhiliangx" ]
}
PUT /product/_doc/6
{
    "name" : "xiaomi phone 10",
    "desc" :  "chongdian zeikuai diaodian gengkuai,chaoji wudi wangyuanjing,gaoshua dianjingping",
    "price" :  "5999",
    "lv":"qijianji",
    "type":"phone",
    "createtime":"2020-07-27",
    "tags": [ "120Hz", "120W", "120bianjiao" ]
}
PUT /product/_doc/7
{
    "name" : "aipao SE2",
    "desc" :  "chule CPU,nothing",
    "price" :  "3299",
    "lv":"qijianji",
    "type":"phone",
    "createtime":"2020-07-21",
    "tags": [ "gejiucai", "gejiujiucai", "gexinjiucai" ]
}
PUT /product/_doc/8
{
    "name" : "XS Max",
    "desc" :  "tingshuo yaochu 12 le zhongyu keyi huandiao shouli de 4S le",
    "price" :  4399,
    "lv":"qijianji",
    "type":"shouji",
    "createtime":"2020-08-19",
    "tags": [ "5V1A", "4Gquanwangtong", "big" ]
}
PUT /product/_doc/9
{
    "name" : "xiaomi TV",
    "desc" :  "Sydney's KTV",
    "price" :  2998,
    "lv":"gaoduanji",
    "type":"erji",
    "createtime":"2020-08-16",
    "tags": [ "jumo", "jiatingyingyuan", "games" ]
}
PUT /product/_doc/10
{
    "name" : "hongmi TV",
    "desc" :  "wo bishangmian nage genghuasuan,woye 2998,woye 70 cun,danshi wo genghaokan",
    "price" :  2999,
    "type":"TV",
    "lv":"gaoduanji",
    "createtime":"2020-08-28",
    "tags": [ "dapian", "languang8K", "chaobo" ]
}


到了这里,关于ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

      1.3.1 请求product模块 2.修改数据库,推送rabbitmq中 1.3.2 rabbitmq的工具类  1.3.3 search模块中rabbit客户端订阅信息  1.监听器监听信息  2.调用相应的上下架方法 2.1 调用product模块,返回完整信息 2.2 将信息入到es库中 1.其中注解 @Feginclient(value=xxxx) , xxx为调用模块配置文件中spr

    2024年02月09日
    浏览(45)
  • ES 自定义评分实现结果集排序问题

    需求是根据短句查询后,不分词全包含(类似mysql的like)的语句要在最上边,其次是分词后的数据全包含的排在后边,然后是包含部分分词的数据,最后这三类数据要根据时间倒叙,自带的评分机制无法满足需求,所以使用function_score 自定义结果的评分: 用到了ik分词器 由于

    2024年02月13日
    浏览(43)
  • mybatis xml 中的 大于、小于、等于 写法

    在 *.xml 中使用常规的 = = = 会与xml的语法存在冲突 字符名称 sql符号 转义字符 大于号 gt; 小于号 lt; 不等于 lt;gt; 大于等于号 = gt;= 小于等于号 = lt;= 与 amp; 单引号 \\\' apos; 双引号 \\\" quot; sql语句 xml 语句 转义字符 之前不能有空格,例如: gt; 或者 g t; 都是错误的 转义字符 必须以

    2023年04月26日
    浏览(50)
  • js 校验 大于等于0小于等于100

    如果你想要在JavaScript中校验一个数值是否在0到100之间(包括0和100),你可以使用以下的函数: 你可以使用这个函数来检查一个值是否在指定的范围内。例如: 如果你需要在一个表单验证中使用这个函数,你可以这样做: 在这个例子中, validateRange 函数会检查用户输入的值

    2024年01月17日
    浏览(60)
  • mybatis xml 中 大于、小于、等于 写法

    在 *.xml 中使用常规的 = = = 会与xml的语法存在冲突 字符名称 sql符号 转义字符 大于号 gt; 小于号 lt; 不等于 lt;gt; 大于等于号 = gt;= 小于等于号 = lt;= 与 amp; 单引号 \\\' apos; 双引号 \\\" quot; sql语句 xml 语句 转义字符 之前不能有空格,例如: gt; 或者 g t; 都是错误的 转义字符 必须以

    2023年04月25日
    浏览(44)
  • 解决uniapp 小程序 vendor.js过大 大于500K 无法转换ES5问题

    项目页面147个,编译后的vendor.js大小2.4M,导致无法正常转换ES5,导致sourcemap下载后都是分号;;;;;, 无法定位线上错误日志的文件位置. 第一步是最重要的,非核心页面做分包处理分包处理文档,然后在manifest.json文件中进行如下配置,这样打包的时候只有主包页面会打包到vendor.js内 man

    2024年02月16日
    浏览(34)
  • 【mybatis】xml 大于|小于|等于 写法及介绍

    在 *.xml 中使用常规的 = = = 会与xml的语法存在冲突 字符名称 sql符号 转义字符 大于号 gt; 小于号 lt; 不等于 lt;gt; 大于等于号 = gt;= 小于等于号 = lt;= 与 amp; 单引号 \\\' apos; 双引号 \\\" quot; sql语句 xml 语句 转义字符 之前不能有空格,例如: gt; 或者 g t; 都是错误的 转义字符 必须以

    2023年04月26日
    浏览(50)
  • MyBatis XML 中大于等于小于等于的写法

    第一种方法 :  XML转义字符 用了转义字符把 和 替换掉,然后就没有问题了 大于:gt; 小于:lt; 大于等于:gt;= 小于等于:lt;= 第二种方法 : ![CDATA[ sql语句 ]]语法 因为这个是xml格式的,所以不允许出现类似“”这样的字符,但是都可以使用![CDATA[ ]]符号进行说明,将此类符号

    2024年02月17日
    浏览(41)
  • Springcloudalibaba整合es!实现相关性排序,集成完代码真香

    org.springframework.boot spring-boot-starter-data-elasticsearch 2.0.1.RELEASE com.querydsl querydsl-apt 4.2.2 com.querydsl querydsl-jpa 4.2.2 ma.glasnost.orika orika-core 1.5.2 相关性排序实现思路原理图: ============= 核心代码实现: kibana:查询json { “function_score” : { “query” : { “bool” : { “must” : [ { “multi_match”

    2024年04月22日
    浏览(29)
  • ElasticSearch系列 - SpringBoot整合ES:实现搜索结果排序 sort

    00. 数据准备 01. Elasticsearch 默认的排序方式是什么? ElasticSearch 默认的排序方式是相关性排序。相关性排序是根据查询条件与文档的匹配程度来计算每个文档的相关性得分,然后按照得分从高到低进行排序。相关性排序是 ElasticSearch 中最常用的排序方式,因为它可以根据查询

    2024年02月02日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包