ES通过Collapse实现类似SQL over开窗函数功能

news/2024/7/7 6:41:02 标签: sql, 数据库, es, elasticsearch

数据如下:

ab
101
102
103
2020
2010
2030

需求:

按照a列进行分组,然后按照b列进行排序,返回b列中最小的结果对应的数据。类似SQL :

sql">select a,b from (select a,b,row_number() over (partition by a order by b asc) as rank from tbl ) t where rank =1

想要得到的结果:

ab
101
2010

实现:

es中可以通过collapse来实现以上功能,关于collapse的使用官方解释如下:

You can use the collapse parameter to collapse search results based on field values. The collapsing is done by selecting only the top sorted document per collapse key.

For example, the following search collapses results by user.id and sorts them by http.response.bytes.

sql">GET my-index-000001/_search
{
  "query": {
    "match": {
      "message": "GET /search"
    }
  },
  "collapse": {
    "field": "user.id"    ----- ①     
  },
  "sort": [
    {
      "http.response.bytes": { -----②
        "order": "desc"
      }
    }
  ],
  "from": 0     -------③               
}

    
①:Collapse the result set using the user.id field


②:Sort the results by http.response.bytes


③:Define the offset of the first collapsed result

 es中创建索引并插入测试数据:

sql">DELETE test

PUT /test/_doc/1
{
  "a":10,
  "b":1
}

PUT /test/_doc/2
{
  "a":10,
  "b":2
}

PUT /test/_doc/3
{
  "a":10,
  "b":3
}

PUT /test/_doc/4
{
  "a":20,
  "b":20
}

PUT /test/_doc/5
{
  "a":20,
  "b":10
}

PUT /test/_doc/6
{
  "a":20,
  "b":30
}

编写查询语句:
 

sql">GET  /test/_search
{
  "query": {
    "match_all": {}
  },
  "collapse": {
    "field": "a"
  },
  "sort": [
    {
      "b": {
        "order": "asc"
      }
    }
  ]
}

结果如下:

sql">{
  "took" : 855,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 6,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "a" : 10,
          "b" : 1
        },
        "fields" : {
          "a" : [
            10
          ]
        },
        "sort" : [
          1
        ]
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : null,
        "_source" : {
          "a" : 20,
          "b" : 10
        },
        "fields" : {
          "a" : [
            20
          ]
        },
        "sort" : [
          10
        ]
      }
    ]
  }
}


http://www.niftyadmin.cn/n/5049644.html

相关文章

界面组件DevExpress WinForms v23.1 - 富文本编辑器等功能升级

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

jvm深入研究文档-探索虚拟机栈底层代码到底是如何实现的?--jvm底层探索(3)

这个是这个系列的上一个文章(传送门): jvm深入研究文档--程序执行专业户-虚拟机栈--jvm底层探索(2)_一单成的博客-CSDN博客 阿丹: 在上一个文章中,主要探讨了虚拟机栈的主要组成成员以及中间的…

Python库学习(七):科学计算库Numpy[续篇一]:结构数组

1.介绍 结构数组是NumPy中的一种高级数据结构,它允许用户在单个数组中存储多种数据类型的元素。与普通的NumPy数组不同,结构数组的每个元素可以具有不同的数据类型,并且可以使用字段名来引用这些元素。这使得结构数组非常适合处理表格数据、…

金融业务-房产业务

文章目录 1. 信用贷(Unsecured Loans)2. 交易垫资(Transaction Loans)3. 房产抵押贷款(Mortgage Loans)4. 转贷垫资(Bridge Loans) 金融机构的房贷业务涵盖了多种不同的产品&#xf…

每日一题~修剪二叉树

原题链接:669. 修剪二叉搜索树 - 力扣(LeetCode) 题目描述: 思路分析: 由题可知,我们要将原来的二叉搜索树调整为值在 low~high 之间的新二叉搜索树,接下来我们分析一下针对不同的节点的处理方…

leetcode20. 有效的括号 [简单题]

题目 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型…

【从0学习Solidity】41. WETH

【从0学习Solidity】41. WETH 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发…

基于win32实现TB登陆滑动验证

这里写目录标题 滑动验证触发条件:失败条件:解决方法:清除cooKie 滑动验证方式一:win32 api获取窗口句柄,选择固定位置 成功率高方式二: 原自动化滑动,成功率中 案例 先谈理论,淘宝 taobao.com …