跳转到主内容
极星编程网:以代码为星,赴技术山海!

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

本文深入探讨了在 Elasticsearch 中实现复杂多字段条件排序的策略。针对文档需要根据标签存在性进行优先级排序,并在不同标签状态下对创建时间应用不同排序方向(有标签时按创建时间升序,无标签时按创建时间降序)的需求,文章提供了基于 Painless 脚本的解决方案,详细阐述了脚本逻辑、索引映射、数据准备及结果分析,并给出了性能考量和最佳实践。 引言 在数据检索和展示中,排序是至关重要的一环。Elasticsearch 提供了强大的排序能力,支持按单个字段、多个字段以及多种数据类型进行排序。然而,当排序逻辑涉及复杂的条件判断,例如“如果字段 A 存在,则按字段 B 升序;如果字段 A 不存在,则按字段 C 降序”时,传统的字段排序可能无法满足需求。本文将聚焦于一个具体的场景:如何实现文档首先根据 tags 字段是否存在进行排序,然后在有 tags 的文档中按 createdAt 升序 排列 ,而在没有 tags 的文档中按 createdAt 降序排列。我们将通过 Elasticsearch 的脚本排序功能(Script-based Sorting)来解决这一挑战。 索引映射配置 首先,我们需要创建一个 Elasticsearch 索引并定义相关的字段映射。createdAt 字段应为 date 类型以便进行时间排序,tags 字段应为 key word 类型以便于脚本中判断其存在性及数量。 unity3d游戏开发之相机切换 中文WORD版 本文档主要讲述的是unity3d游戏开发之相机切换;希望对大家会有帮助;感兴趣的朋友可以过来看看 下载
PUT idx_conditional_sort { "mappings": { "properties": { "createdAt": { "type": "date" }, "tags": { "type": "keyword" } } } }
准备示例数据 为了演示排序效果,我们插入几条包含不同 tags 状态和 createdAt 值的文档:
POST idx_conditional_sort/_doc { "createdAt": "2022-11-25T09:45:00.000Z", "tags": [ "Response Needed" ] } POST idx_conditional_sort/_doc { "createdAt": "2022-11-24T09:45:00.000Z", "tags": [ "Response 02" ] } POST idx_conditional_sort/_doc { "createdAt": "2022-11-24T09:45:00.000Z", "tags": [ "Customer care","Response Needed" ] } POST idx_conditional_sort/_doc { "createdAt": "2022-11-26T09:45:00.000Z",

相关文章