分页与排序|Elasticsearch 七日笔记 09
学习目标
- 学习如何通过分页和排序控制查询结果,提升数据检索的灵活性。
本文继续沿用第 7 篇准备的 users 数据。
分页
- 定义:
- 控制查询结果的返回范围,类似 SQL 的
LIMIT。
- 控制查询结果的返回范围,类似 SQL 的
- 参数:
from:起始位置,从 0 开始。size:每页返回数量,默认 10。
- 示例:
GET /users/_search { "from": 0, "size": 2, "query": { "match_all": {} } }- 返回:前 2 条数据。
- 注意:
- 深分页(大
from)性能较低,建议用scrollAPI。
- 深分页(大
排序
- 定义:
- 按字段值排序结果。
- 参数:
sort:数组,指定字段和排序顺序。order:"asc"(升序)或"desc"(降序)。
- 示例:
GET /users/_search { "sort": [ {"age": {"order": "desc"}} ], "query": { "match_all": {} } }- 返回:按
age降序排列的文档。
- 返回:按
- 注意:
- 需字段支持排序(
keyword或数值类型)。
- 需字段支持排序(
组合示例
- 分页+排序:
GET /users/_search { "from": 0, "size": 1, "sort": [ {"age": {"order": "asc"}} ], "query": { "match": {"name": "Alice"} } }- 返回:
name含“Alice”的文档中,age最小的一条。
- 返回:
动手实践:分页与排序
目标
- 控制查询结果的顺序和数量。
步骤
- 按年龄升序,分页取第 2 条:
- 运行:
GET /users/_search { "from": 1, "size": 1, "sort": [ {"age": {"order": "asc"}} ], "query": { "match_all": {} } } - 预期:返回 ID 为 1 的文档(age 25)。
- 运行:
- 按年龄降序取前 2 条:
- 运行:
GET /users/_search { "size": 2, "sort": [ {"age": {"order": "desc"}} ], "query": { "match_all": {} } } - 预期:返回 ID 为 2(age 30)和 3(age 28)。
- 运行:
- 验证:
- 检查返回顺序和数量是否正确。
注意事项
from从 0 开始,size控制总数。- 确保字段类型支持排序(
age为integer)。
关键点
- 分页限制:
- 默认最大 10,000 条(
from + size),超限需用scroll。
- 默认最大 10,000 条(
- 排序字段:
text字段需用field.keyword排序。
常见问题及解决方法
- 问题:分页超出范围。
- 原因:
from + size超过 10,000。 - 解决:
- 检查总数:
GET /users/_count。 - 用
scrollAPI 处理大数据。
- 检查总数:
- 原因:
- 问题:排序不生效。
- 原因:字段类型不支持。
- 解决:
- 检查映射:
GET /users/_mapping。 - 确保
age为integer。
- 检查映射:
学习建议
- 分页测试:
- 修改
from和size,观察返回变化。
- 修改
- 排序实验:
- 尝试多字段排序(如
age+name.keyword)。
- 尝试多字段排序(如
- 笔记记录:
- 整理每种查询的语法和返回示例。
总结
第三天通过理论学习,你掌握了 ES 的简单查询(match 和 term)、组合查询(bool)以及分页和排序功能;通过实践操作,你在 Kibana 中执行了多种搜索命令,验证了结果并理解了搜索机制。这是 ES 核心能力的起点,为后续的聚合和高级查询奠定了基础。明天将进入更复杂的聚合与高级查询,准备好探索数据分析和模糊搜索吧!
本文是《Elasticsearch 七日笔记》系列的第 9 篇,对应第 3 天的学习内容。
