找回密码
 立即注册
查看: 664|回复: 0

[其它] elasticsearch 深度分页查询 Search_after

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-7-8 12:09:08 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 2024-7-8 12:14 编辑

1. 概述

在使用Elasticsearch进行深度分页查询时,传统的from+size方式会带来性能问题。为了解决这个问题,Elasticsearch引入了search_after参数,能够高效地实现深度分页。本文将详细介绍search_after的概念、使用方法及其优势。

1.1 深度分页的挑战

在Elasticsearch中,深度分页指的是从一个非常大的结果集中获取数据。传统的from+size分页方式在处理深度分页时性能会急剧下降,因为Elasticsearch需要遍历大量的文档来计算偏移量。这不仅消耗大量的内存和CPU资源,还会导致查询速度变慢。

2. search_after的概念

search_after参数是一种高效的深度分页解决方案。它基于游标机制,利用上一页结果的排序值来定位下一页的起始位置,从而避免了遍历和计算偏移量的问题。

2.1 search_after的工作原理

search_after参数需要依赖排序字段来定位分页的起始位置。每次查询时,返回结果中包含用于下一次查询的search_after值,这个值是一个数组,包含排序字段的值。

3. search_after的使用方法

在使用search_after时,需要遵循以下步骤:

(1) 首次查询时,指定排序字段。

(2) 获取查询结果中的search_after值。

(3) 在后续查询中,使用search_after参数来指定分页的起始位置。

3.1 初次查询

首先,我们进行初次查询,指定排序字段,并获取search_after值。例如:

  1. POST /my_index/_search
  2. {
  3.   "size": 10,
  4.   "sort": [
  5.     {"timestamp": "asc"},
  6.     {"_id": "asc"}
  7.   ],
  8.   "query": {
  9.     "match_all": {}
  10.   }
  11. }
复制代码


返回结果中包含排序字段的值,可以作为下一次查询的search_after参数。

3.2 后续查询

在后续查询中,使用search_after参数指定分页起始位置。例如:

  1. POST /my_index/_search
  2. {
  3.   "size": 10,
  4.   "sort": [
  5.     {"timestamp": "asc"},
  6.     {"_id": "asc"}
  7.   ],
  8.   "search_after": ["2023-01-01T00:00:00", "1"]
  9. }
复制代码


4. search_after的优势

(1) 高效:避免了深度分页时的遍历和计算偏移量问题,大幅提高查询性能。

(2) 可扩展性:适用于大规模数据集,能够轻松处理数百万甚至数亿条数据的分页查询。

(3) 稳定性:在高并发场景下,使用search_after能够更好地保持查询性能的稳定性。

5. search_after的注意事项

(1) 必须指定排序字段:search_after依赖排序字段来定位分页起始位置,因此必须在查询中指定排序字段。

(2) _id字段作为辅助排序:为了确保结果的唯一性,通常会在排序字段中加入_id字段作为辅助排序。

(3) 不适用于动态排序:search_after依赖固定的排序字段,如果在查询过程中需要动态改变排序字段,search_after可能不适用。

6. 实践案例

以下是一个完整的实践案例,展示如何使用search_after进行深度分页查询。

6.1 索引数据

假设我们有一个包含日志数据的索引my_index,其中包含timestamp和message字段。

  1. POST /my_index/_bulk
  2. { "index": { "_id": "1" } }
  3. { "timestamp": "2023-01-01T00:00:00", "message": "log1" }
  4. { "index": { "_id": "2" } }
  5. { "timestamp": "2023-01-01T00:01:00", "message": "log2" }
  6. ...
复制代码

6.2 初次查询

我们进行初次查询,获取前10条数据:

  1. POST /my_index/_search
  2. {
  3.   "size": 10,
  4.   "sort": [
  5.     {"timestamp": "asc"},
  6.     {"_id": "asc"}
  7.   ],
  8.   "query": {
  9.     "match_all": {}
  10.   }
  11. }
复制代码


6.3 获取search_after值

假设返回结果中的最后一条数据的timestamp为"2023-01-01T00:09:00",_id为"10"。

6.4 后续查询

使用search_after进行下一页查询:

  1. POST /my_index/_search
  2. {
  3.   "size": 10,
  4.   "sort": [
  5.     {"timestamp": "asc"},
  6.     {"_id": "asc"}
  7.   ],
  8.   "search_after": ["2023-01-01T00:09:00", "10"]
  9. }
复制代码

7. 总结

本文介绍了Elasticsearch中search_after参数的概念、使用方法及其优势。通过合理使用search_after,可以高效地实现深度分页查询,提高查询性能和可扩展性。在实际应用中,选择适当的排序字段,并结合具体需求进行配置,可以充分发挥search_after的优势。





------------------------------------------------------------------------------------------------------------------------------------------

========  御 坂 主 机  ========

>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<

>> 推广/合作/找我玩  TG号 : @Misaka_Offical <<

-------------------------------------------------------------------------------------------------------------------------------------------

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:36 , Processed in 0.062099 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表