当前位置: 首页 > news >正文

ElasticSearch DSL查询之排序和分页

一、排序功能

1. 默认排序

在 Elasticsearch 中,默认情况下,查询结果是根据 相关度 评分(score)进行排序的。我们之前已经了解过,相关度评分是通过 Elasticsearch 根据查询条件与文档内容的匹配程度自动计算得出的。如果不指定排序条件,Elasticsearch 会使用默认的相关度评分来排序查询结果。



2. 自定义排序

如果我们希望按照其他字段进行排序,而非使用默认的相关度排序(例如,按照价格、销量等字段),可以使用 sort 参数来指定排序字段。

排序字段的要求: 必须是数值类型、地理坐标或日期类型。

自定义排序的语法如下:

GET /indexName/_search
{"query": {"match_all": {}},"sort": [{"field": "asc"   // "排序字段":"排序方式" (asc:升序、desc:降序)}]
}
  • field:指定需要排序的字段名。asc(升序)或 desc(降序)。



3. 多字段排序

当需要根据多个字段进行排序时,我们可以在 sort 参数中指定多个字段。排序会根据数组中指定的顺序逐级进行:

  1. 首先按第一个字段排序。
  2. 如果第一个字段的值相同,则按第二个字段排序,以此类推。

例如,若我们需要先按销量排序,销量相同的情况下再按价格升序排序:



查询语句如下:

GET /items/_search
{"query": {"match_all": {}},"sort": [{"sold": "desc"  // 按销量降序排序},{"price": "asc"  // 销量相同,按价格升序排序}]
}

4. 排序结果说明

  • 排序后的查询结果不再根据相关度评分(_score)进行排序,因为我们已经指定了排序字段。
  • 结果中的 score 字段将为 null,因为排序不再依赖于相关度评分。
  • 查询结果将按照我们指定的排序字段进行排列。




二、分页功能

Elasticsearch 默认返回查询结果的前 10 条数据。如果我们希望查看更多数据,或者翻页查看查询结果,可以使用分页参数:fromsize

  • from:指定从第几条文档开始(类似于 SQL 中的 OFFSET)。
  • size:指定返回的文档数量(类似于 SQL 中的 LIMIT)。

分页的语法如下:

GET /items/_search
{"query": {"match_all": {}},"from": 0,   // 分页开始的位置,默认为0,从第 0 条开始"size": 10,   // 期望获取的文档总数,返回 10 条结果
}




三、分页与排序结合

在实际业务中,我们常常需要将分页和排序结合使用。

假设我们需要查询销量排名前 10 的商品,并且在销量相同的情况下按照价格升序排序。



查询语句:

GET /items/_search
{"query": {"match_all": {}},"sort": [{"sold": "desc"  // 按销量降序排序},{"price": "asc"  // 销量相同,按价格升序排序}],"from": 0,   // 从第 0 条开始"size": 10   // 返回 10 条结果
}

返回结果:




四、分页翻页

分页查询支持翻页功能。当我们查询第一页的结果时(from: 0, size: 10),若需要查看第二页的数据,可以将 from 设置为 10(即跳过前 10 条数据),然后返回接下来的 10 条数据:

GET /items/_search
{"query": {"match_all": {}},"sort": [{"sold": "desc"  // 按销量降序排序},{"price": "asc"  // 销量相同,按价格升序排序}],"from": 10,   // 跳过前 10 条数据,开始返回第 11 条"size": 10   // 返回 10 条结果
}




五、总结

  • 排序:通过 sort 参数指定排序字段,支持单字段排序和多字段排序。
  • 分页:通过 fromsize 参数控制返回数据的范围和条数。
  • 排序与分页结合:可以同时使用排序和分页功能,实现复杂的查询需求。
http://www.lryc.cn/news/524642.html

相关文章:

  • uniapp封装websocket
  • 【Linux】18.Linux进程控制(2)
  • reactor框架使用时,数据流请求流程
  • 读西瓜书的数学准备
  • 摄像头模块如何应用在宠物产品领域
  • c++学习第七天
  • Ubuntu 24.04 LTS 通过 docker 安装 nextcloud 搭建个人网盘
  • RabbitMQ1-消息队列
  • Open3D计算点云粗糙度(方法一)【2025最新版】
  • 算法6(力扣148)-排序链表
  • 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用
  • 【大数据2025】MapReduce
  • Windows图形界面(GUI)-QT-C/C++ - Qt List Widget详解与应用
  • 深度学习python基础(第二节) 分支语句和循环语句
  • Gin 源码概览 - 路由
  • 第6章 ThreadGroup详细讲解(Java高并发编程详解:多线程与系统设计)
  • CentOS 7乱码问题如何解决?
  • JavaScript语言的多线程编程
  • OpenSeaOtter使用手册-变更通知和持续部署
  • (2)STM32 USB设备开发-USB虚拟串口
  • 他把智能科技引入现代农业领域
  • ingress-nginx代理tcp使其能外部访问mysql
  • 麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构
  • 亚博microros小车-原生ubuntu支持系列:4-手部检测
  • 关于回调函数(callback)
  • Linux Bash 中使用重定向运算符的 5 种方法
  • 硬件作品3----STM32F103RCT6最小系统板MCU配置
  • 人脸识别打卡系统--基于QT(附源码)
  • 【深度学习入门】深度学习知识点总结
  • 通过视觉语言模型蒸馏进行 3D 形状零件分割