Elasticsearch多字段条件排序:利用Painless脚本实现复杂逻辑

elasticsearch多字段条件排序:利用painless脚本实现复杂逻辑

在Elasticsearch中,常规的单字段或多字段排序通常能够满足大部分需求。然而,当面临需要根据字段的特定状态(例如字段是否存在、字段值是否为空)来决定排序优先级,并且在此基础上再结合其他字段进行排序时,标准排序机制可能显得力不从心。这时,Elasticsearch提供的脚本排序(Script-Based Sorting)功能便成为解决此类复杂问题的强大工具。

Elasticsearch中的复杂排序需求

考虑以下场景:我们需要对文档进行排序,首先根据 tags 字段是否包含任何标签来区分文档。有标签的文档应优先显示,然后按 createdAt 字段升序排列;而没有标签的文档则排在后面,同样按 createdAt 字段升序排列。这种“有条件”的排序逻辑,正是脚本排序的典型应用场景。

环境准备:索引映射与示例数据

为了演示这一过程,我们首先需要创建一个Elasticsearch索引,并定义相应的字段映射。createdAt 字段应为 date 类型以便进行时间排序,而 tags 字段则应为 keyword 类型,以支持精确匹配和脚本访问其内容。

PUT idx_sort{  "mappings": {      "properties": {        "createdAt": {          "type": "date"        },        "tags": {          "type": "keyword"        }      }    }}

接下来,我们插入一些示例文档,这些文档包含不同 tags 状态和 createdAt 时间,以验证我们的排序逻辑。

POST idx_sort/_doc{    "createdAt": "2022-11-25T09:45:00.000Z",    "tags": [      "Response Needed"    ]}POST idx_sort/_doc{    "createdAt": "2022-11-24T09:45:00.000Z",    "tags": [      "Response 02"    ]}POST idx_sort/_doc{    "createdAt": "2022-11-24T09:45:00.000Z",    "tags": [      "Customer care","Response Needed"    ]}POST idx_sort/_doc{    "createdAt": "2022-11-24T09:45:00.000Z",    "tags": [    ]}

核心实现:Painless脚本排序

解决上述复杂排序需求的关键在于使用 _script 排序。我们将在排序数组中定义一个基于Painless语言的脚本,该脚本负责为每个文档生成一个临时的排序值。

Painless脚本详解

脚本的核心逻辑是判断 tags 字段是否为空。在Painless脚本中,可以通过 doc[‘field_name.keyword’] 来访问字段的 fielddata,并使用 .size() 方法获取多值字段的元素数量。

          def list = doc['tags.keyword']; // 获取tags字段的fielddata          if(list.size() > 0){           // 判断tags列表是否包含元素            return 1;                    // 如果有标签,返回1作为排序值          } else {            return 0;                    // 如果没有标签,返回0作为排序值          }

这个脚本会为每个文档生成一个数字:如果 tags 字段有值,则返回 1;如果 tags 字段为空,则返回 0。我们将这个脚本作为主要的排序键,并将其 order 设置为 desc(降序),这样 1(有标签)的文档就会排在 0(无标签)的文档之前。

腾讯智影-AI数字人 腾讯智影-AI数字人

基于AI数字人能力,实现7*24小时AI数字人直播带货,低成本实现直播业务快速增增,全天智能在线直播

腾讯智影-AI数字人 73 查看详情 腾讯智影-AI数字人

辅助排序

在脚本排序之后,我们需要添加 createdAt 字段的排序。当多个文档通过脚本排序得到相同的值时(例如,所有有标签的文档都得到 1),Elasticsearch会根据 sort 数组中的下一个排序条件进行排序。在本例中,我们希望 createdAt 按升序排列。

    {      "createdAt": {        "order": "asc"      }    }

完整查询示例

将上述脚本排序和辅助排序结合起来,构成完整的搜索查询:

GET idx_sort/_search{  "sort": [    {      "_script": {        "type": "number",        "script": {          "lang": "painless",          "source": """          def list = doc['tags.keyword'];          if(list.size() > 0){            return 1;          } else {            return 0;          }          """        },        "order": "desc"      }    },    {      "createdAt": {        "order": "asc"      }    }  ]}

结果解析

执行上述查询后,Elasticsearch将返回排序后的文档。观察 hits 数组中的 sort 字段,它会显示每个文档对应的排序键值。例如,[1, 1669283100000] 表示该文档的脚本排序值为 1,createdAt 字段的时间戳为 1669283100000。

"hits": [      {        "_index": "idx_sort",        "_id": "kI89toQBEoAIompjxkWN",        "_score": null,        "_source": {          "createdAt": "2022-11-24T09:45:00.000Z",          "tags": [            "Customer care",            "Response Needed"          ]        },        "sort": [          1,          1669283100000        ]      },      {        "_index": "idx_sort",        "_id": "j489toQBEoAIompjkkXO",        "_score": null,        "_source": {          "createdAt": "2022-11-24T09:45:00.000Z",          "tags": [            "Response 02"          ]        },        "sort": [          1,          1669283100000        ]      },      {        "_index": "idx_sort",        "_id": "jo83toQBEoAIompjcEXD",        "_score": null,        "_source": {          "createdAt": "2022-11-25T09:45:00.000Z",          "tags": [            "Response Needed"          ]        },        "sort": [          1,          1669369500000        ]      },      {        "_index": "idx_sort",        "_id": "kY8-toQBEoAIompj6kXg",        "_score": null,        "_source": {          "createdAt": "2022-11-24T09:45:00.000Z",          "tags": []        },        "sort": [          0,          1669283100000        ]      }    ]

从结果中可以看出,所有带有标签的文档(脚本排序值为 1)都排在了前面,并且在它们内部,根据 createdAt 字段进行了升序排列。接着是无标签的文档(脚本排序值为 0),同样根据 createdAt 字段升序排列。

注意事项与性能考量

性能影响: 脚本排序的性能开销通常高于基于字段值的常规排序。因为每个文档在排序时都需要执行脚本,这会消耗CPU资源。对于大型数据集,应谨慎使用,并尽可能优化脚本逻辑。字段数据(Fielddata): 访问 doc[‘field_name.keyword’] 需要Elasticsearch加载该字段的 fielddata 到内存中。对于 text 字段,fielddata 默认是禁用的,因为它可能消耗大量内存。对于 keyword 字段,fielddata 通常是默认启用的,但仍需注意其内存占用。脚本安全性: Painless是Elasticsearch专门为安全和高性能设计的脚本语言,它运行在一个沙盒环境中。尽管如此,编写脚本时仍应遵循最佳实践,避免不必要的复杂性。更复杂的条件排序: 本教程中 createdAt 字段的排序方向是固定的(升序)。如果需要实现更复杂的条件,例如“有标签时 createdAt 升序,无标签时 createdAt 降序”,则需要将 createdAt 的排序逻辑也整合到主脚本中,返回一个能够反映这种复杂逻辑的复合排序值。例如,可以返回一个浮点数,其整数部分表示标签存在性,小数部分表示 createdAt 的逆序或正序值。但这会显著增加脚本的复杂性。

总结

通过本教程,我们学习了如何利用Elasticsearch的脚本排序功能,结合Painless脚本来处理多字段和条件性的复杂排序需求。这种方法提供了极大的灵活性,能够根据业务逻辑动态生成排序键,从而实现精确的数据组织和呈现。在实际应用中,务必权衡其带来的灵活性与潜在的性能开销,并进行充分的测试和优化。

以上就是Elasticsearch多字段条件排序:利用Painless脚本实现复杂逻辑的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/312192.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
AO3中文入口地址_ AO3官网正版入口
上一篇 2026年10月29日 12:05:06
边缘智能:定义、应用、组成和优势
下一篇 2025年11月7日 15:13:32

相关推荐

  • 谷歌报告称安卓用户收到的诈骗短信比iPhone少58%

    谷歌报告称安卓用户收到的诈骗短信比iPhone少58%谷歌报告称安卓用户收到的诈骗短信比iPhone少58%谷歌报告称安卓用户收到的诈骗短信比iPhone少58%谷歌报告称安卓用户收到的诈骗短信比iPhone少58%

    谷歌于昨日(10月30日)发布了一篇博文,公布了其联合yougov在美国、印度和巴西,对超过5000名用户进行的一项调查结果。该调查的核心结论是:安卓用户收到的诈骗短信,比苹果ios用户要少58%。 报告核心数据:安卓用户满意度更高 报告指出,在接受调查前的一周内,报告称“没有收到任何诈骗短信”的安…

    2026年10月29日 • 用户投稿
    200
  • pp助手pc版官方主页直达地址 pp助手pc版平台入口链接直达主页

    pp助手pc版官方主页直达地址 pp助手pc版平台入口链接直达主页pp助手pc版官方主页直达地址 pp助手pc版平台入口链接直达主页pp助手pc版官方主页直达地址 pp助手pc版平台入口链接直达主页pp助手pc版官方主页直达地址 pp助手pc版平台入口链接直达主页

    pp助手pc版官方主页直达地址是https://www.25pp.com/,该平台提供应用分发、文件管理、数据传输及系统优化等功能,支持跨设备连接与多型号安卓手机识别,具备简洁的界面设计和高效的交互响应体验。 pp助手pc版官方主页直达地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来p…

    2026年10月29日 • 用户投稿
    000
  • Java如何开发一个简单的任务管理工具

    Java如何开发一个简单的任务管理工具Java如何开发一个简单的任务管理工具Java如何开发一个简单的任务管理工具Java如何开发一个简单的任务管理工具

    首先定义任务类Task封装属性和方法,再创建TaskManager类管理任务的增删改查,接着通过Main类实现命令行交互菜单,最后可扩展文件存储或图形界面。 开发一个简单的任务管理工具,用Java实现并不复杂。核心是设计好任务模型、管理类和用户交互方式。下面一步步说明如何从零开始构建这样一个工具。 …

    2026年10月29日 • 用户投稿
    100
  • WooCommerce 单产品页复制加购按钮并实现自定义重定向教程

    本文详细介绍了如何在 WooCommerce 单产品页面复制“添加到购物车”按钮,并为其配置独立的自定义重定向逻辑,同时确保原始加购功能及其相关钩子不受影响。通过结合使用 WooCommerce 动作钩子、jQuery 动态添加隐藏字段以及 woocommerce_add_to_cart_redir…

    2026年10月29日
    200
  • 修改 fetch 响应体:创建新 Response 对象的实践指南

    修改 fetch 响应体:创建新 Response 对象的实践指南修改 fetch 响应体:创建新 Response 对象的实践指南修改 fetch 响应体:创建新 Response 对象的实践指南修改 fetch 响应体:创建新 Response 对象的实践指南

    本文详细介绍了如何在 javascript 中修改 `fetch` 请求的响应体。由于 `response` 对象是不可变的,直接修改其内容无法生效。核心方法是先获取原始响应体,进行所需修改后,再利用原始响应的状态码、状态文本和头部信息,创建一个全新的 `response` 对象返回。这种方法确保了…

    2026年10月29日 • 用户投稿
    000
  • tiktok官方网页登录入口 tiktok在线登录官网地址

    tiktok官方网页登录入口 tiktok在线登录官网地址tiktok官方网页登录入口 tiktok在线登录官网地址tiktok官方网页登录入口 tiktok在线登录官网地址tiktok官方网页登录入口 tiktok在线登录官网地址

    TikTok官方网页登录入口为https://www.tiktok.com/,用户可通过该网址在线登录,平台涵盖生活、才艺、知识等多元短视频内容,具备强互动性与算法推荐机制,支持多端同步与跨设备实时数据共享,提供点赞、评论、分享及话题挑战等社区互动功能,便于内容传播与创作。 TikTok在线登录官网…

    2026年10月29日 • 用户投稿
    100
  • sublime主题推荐_Sublime个性化界面美化主题精选

    sublime主题推荐_Sublime个性化界面美化主题精选sublime主题推荐_Sublime个性化界面美化主题精选sublime主题推荐_Sublime个性化界面美化主题精选sublime主题推荐_Sublime个性化界面美化主题精选

    Monokai系列是Sublime Text经典暗色主题,黑色背景搭配荧光绿、亮黄等高对比色,辨识度高;Monokai Pro色彩更柔和,支持多变体,需单独安装;One Dark沉稳耐看,Dracula紫红鲜明个性,Solarized Dark极简科学配色;通过Package Control可一键安…

    2026年10月29日 • 用户投稿
    000
  • SublimeText怎么安装Emmet插件_前端开发代码编写提速神器

    SublimeText怎么安装Emmet插件_前端开发代码编写提速神器SublimeText怎么安装Emmet插件_前端开发代码编写提速神器SublimeText怎么安装Emmet插件_前端开发代码编写提速神器SublimeText怎么安装Emmet插件_前端开发代码编写提速神器

    安装Emmet插件可显著提升前端开发效率,核心依赖Package Control完成安装;通过缩写快速生成HTML/CSS代码,减少错误、提高一致性,并支持自定义缩写、过滤器、包裹功能及多光标编辑等高级技巧,实现高效编码。 Sublime Text安装Emmet插件其实没那么复杂,它主要依赖于Pac…

    2026年10月29日 • 用户投稿
    000
  • 谷歌浏览器缓存清理失败怎么办 谷歌浏览器缓存管理优化方法

    谷歌浏览器缓存清理失败怎么办 谷歌浏览器缓存管理优化方法谷歌浏览器缓存清理失败怎么办 谷歌浏览器缓存管理优化方法谷歌浏览器缓存清理失败怎么办 谷歌浏览器缓存管理优化方法谷歌浏览器缓存清理失败怎么办 谷歌浏览器缓存管理优化方法

    首先彻底退出浏览器进程,再通过任务管理器结束所有Chrome进程,随后手动删除系统中的缓存文件夹并重置实验性功能与硬件加速,最后执行完整浏览器重置以恢复默认设置,逐步排查深层问题。 如果清理谷歌浏览器缓存后问题依然存在,说明常规操作未能触及根本原因。这时候需要从更深层的配置和系统级设置入手,逐一排查…

    2026年10月29日 • 用户投稿
    100
  • JavaScript IndexedDB数据库操作

    JavaScript IndexedDB数据库操作JavaScript IndexedDB数据库操作JavaScript IndexedDB数据库操作JavaScript IndexedDB数据库操作

    IndexedDB是浏览器中用于存储大量结构化数据的本地数据库,支持异步操作,通过indexedDB.open()创建或打开数据库,并在onupgradeneeded事件中初始化对象仓库和索引;所有增删改查操作均通过事务进行,使用add、put、get、delete方法实现数据管理,结合游标遍历和索…

    2026年10月29日 • 用户投稿
    100
  • sublime如何配置python开发环境_Sublime Python开发环境搭建指南

    sublime如何配置python开发环境_Sublime Python开发环境搭建指南sublime如何配置python开发环境_Sublime Python开发环境搭建指南sublime如何配置python开发环境_Sublime Python开发环境搭建指南sublime如何配置python开发环境_Sublime Python开发环境搭建指南

    Sublime Text的Python开发核心优势在于其极速响应与高度可定制性。它通过轻量架构实现秒开文件,结合Package Control生态,按需安装LSP-pyright、SublimeLinter等插件,既保证接近IDE的功能完整性,又避免资源冗余。多光标编辑与命令面板进一步提升操作效率,…

    2026年10月29日 • 用户投稿
    200
  • 鸡蛋历险记兑换码是什么 鸡蛋历险记Egging On兑换码大全

    鸡蛋历险记兑换码是什么 鸡蛋历险记Egging On兑换码大全鸡蛋历险记兑换码是什么 鸡蛋历险记Egging On兑换码大全鸡蛋历险记兑换码是什么 鸡蛋历险记Egging On兑换码大全鸡蛋历险记兑换码是什么 鸡蛋历险记Egging On兑换码大全

    鸡蛋历险记egging on最新可用兑换码包括egg888、yolk2025、shell666,可在游戏中直接兑换限定黄金煎锅皮肤、双倍经验卡和1000蛋液,数量有限先到先得,也可配合修改器获取额外奖励。 无限道具|游戏作弊工具: 鸡蛋历险记Egging On当前有效兑换码及使用方式如下: EGG8…

    2026年10月29日 • 用户投稿
    1300
  • 海棠文学城手机入口更新_海棠线上文学城PC版官方网址直达

    海棠文学城手机入口更新_海棠线上文学城PC版官方网址直达海棠文学城手机入口更新_海棠线上文学城PC版官方网址直达海棠文学城手机入口更新_海棠线上文学城PC版官方网址直达海棠文学城手机入口更新_海棠线上文学城PC版官方网址直达

    海棠线上文学城PC版官方网址为https://www.haitbook.com,平台汇集古风言情、现代都市等多元题材,支持多端同步与即时互动评论。 海棠线上文学城PC版官方网址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来海棠线上文学城手机入口更新及PC版官方网址直达,感兴趣的网友一起随…

    2026年10月29日 • 用户投稿
    100
  • 使用 esbuild 混合插件为多个文件生成 IIFE 和单个 ESM 包

    使用 esbuild 混合插件为多个文件生成 IIFE 和单个 ESM 包使用 esbuild 混合插件为多个文件生成 IIFE 和单个 ESM 包使用 esbuild 混合插件为多个文件生成 IIFE 和单个 ESM 包使用 esbuild 混合插件为多个文件生成 IIFE 和单个 ESM 包

    本文介绍了如何使用 esbuild 插件,结合 `esbuild#define` 功能,为 JavaScript 项目同时生成多个 IIFE (Immediately Invoked Function Expression) 文件和单个 ESM (ECMAScript Module) 包。通过自定义…

    2026年10月29日 • 用户投稿
    000
  • 心系天下三星W26广州品鉴会:匠心折叠点亮科技风华

    心系天下三星W26广州品鉴会:匠心折叠点亮科技风华心系天下三星W26广州品鉴会:匠心折叠点亮科技风华心系天下三星W26广州品鉴会:匠心折叠点亮科技风华心系天下三星W26广州品鉴会:匠心折叠点亮科技风华

    10月30日,心系天下三星w26品鉴会于广州盛大启幕,pconline作为受邀媒体亲临现场。当岭南都市的繁华脉搏与前沿科技的璀璨光芒交汇,承载“传承、创新、尊贵、思仁”核心理念的心系天下三星w26,开启了一场东方文化意境与顶级智能体验深度融合的对话。凭借匠心工艺、高雅设计与智慧功能,这款旗舰折叠屏手…

    2026年10月29日 • 用户投稿
    100
  • QQ邮箱网页版访问入口 QQ邮箱网页版官网入口

    QQ邮箱网页版访问入口 QQ邮箱网页版官网入口QQ邮箱网页版访问入口 QQ邮箱网页版官网入口QQ邮箱网页版访问入口 QQ邮箱网页版官网入口QQ邮箱网页版访问入口 QQ邮箱网页版官网入口

    QQ邮箱网页版官网入口是https://mail.qq.com/,用户可通过账号密码、微信扫码或短信验证码登录,支持多端同步与大容量存储、文件中转站、个性签名、邮件撤回及定时发送等功能。 QQ邮箱网页版访问入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来QQ邮箱网页版官网入口,感兴趣的…

    2026年10月29日 • 用户投稿
    000
  • QQ浏览器官方网页版主页地址_QQ浏览器官网下载入口直达

    QQ浏览器官方网页版主页地址_QQ浏览器官网下载入口直达QQ浏览器官方网页版主页地址_QQ浏览器官网下载入口直达QQ浏览器官方网页版主页地址_QQ浏览器官网下载入口直达QQ浏览器官方网页版主页地址_QQ浏览器官网下载入口直达

    QQ浏览器官方网页版主页地址是https://browser.qq.com/,提供高效文件管理、智能阅读模式及多端协同功能,支持文件预览、阅读优化与跨设备同步。 QQ浏览器官方网页版主页地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来QQ浏览器官网下载入口直达,感兴趣的网友一起随小编来…

    2026年10月29日 • 用户投稿
    100
  • 有手就能修 丰田推出极简全地形四驱卡车:专为非洲造

    有手就能修 丰田推出极简全地形四驱卡车:专为非洲造有手就能修 丰田推出极简全地形四驱卡车:专为非洲造有手就能修 丰田推出极简全地形四驱卡车:专为非洲造有手就能修 丰田推出极简全地形四驱卡车:专为非洲造

    10月31日,在刚刚拉开帷幕的东京车展上,丰田推出了一款造型极具未来感与原始风格碰撞的卡车——imv origin。这款车型专为非洲偏远农村地区量身打造,主打极简、耐用和高度可定制化。 作为一款全地形四驱轻型卡车,IMV Origin拥有出色的通过性参数:接近角和离去角分别达到35°和32°,涉水深…

    2026年10月29日 • 用户投稿
    000
  • 夸克浏览器网页版官方主页 夸克浏览器官网链接跳转

    夸克浏览器网页版官方主页是https://www.quark.cn/,该网站提供智能搜索、多端同步和高效工具集成等功能。 夸克浏览器网页版官方主页在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来夸克浏览器官网链接跳转信息,感兴趣的网友一起随小编来瞧瞧吧! https://www.quark…

    2026年10月29日
    000
  • 123平台官网登录地址 123邮箱网页版即时沟通服务

    123平台官网登录地址 123邮箱网页版即时沟通服务123平台官网登录地址 123邮箱网页版即时沟通服务123平台官网登录地址 123邮箱网页版即时沟通服务123平台官网登录地址 123邮箱网页版即时沟通服务

    123平台官网登录地址是https://www.hao123.com,该平台提供网页导航、多引擎搜索、个性化推荐及生活工具服务,并整合邮箱与即时通讯功能,支持跨应用文件传输和多设备消息同步,具有界面简洁、加载快速、多端适配和夜间模式等优化设计。 123平台官网登录地址在哪里?这是不少网友都关注的,接…

    2026年10月29日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信