Elasticsearch:使用search after实现深度分页

2022-07-26 19:41:40 浏览数 (1)

对于大量的数据而言,我们尽量避免使用 from size 这种方法。这里的原因是 index.max_result_window 的默认值是 10K,也就是说 from size 的最大值是1万。搜索请求占用堆内存和时间与 from size 成比例,这限制了内存。

为了避免过度使得我们的 cluster 繁忙,通常 Scroll 接口被推荐作为深层次的 scrolling,但是因为维护 scroll 上下文也是非常昂贵的,所以这种方法不推荐作为实时用户请求。

Elasticsearch:使用from size 实现分页

Elasticsearch:使用游标查询scroll 实现深度分页

本文将介绍Elasticsearch 中的另外一个搜索分页方法:search_after,通过提供实时 cursor 来解决此问题。search_after 是Elasticsearch 5.0 以上版本才提供的功能。

◆ 一、Elasticsearch常见分页方式

Elasticsearch默认采用的分页方式是 from size 的形式,这种形式下,如果数据量不大或者from、size不大的情况下,效率还是蛮高的。但是在深度分页的情况下,这种使用方式效率是非常低的,并发一旦过大,还有可能直接拖垮整个Elasticsearch的集群。

为了避免深度分页带来的内存开销,Elasticsearch内部有一个默认设定,即最多只能查询前10000个文档。那么如果产品必须要做深度分页,那么应该采取什么方案呢?

使用scroll滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来。scroll搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的。每次发送scroll请求,我们还需要指定一个scroll参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能完成就可以了。

一个 scroll 搜索允许我们做一个初始阶段搜索并且持续批量从Elasticsearch里拉取结果直到没有结果剩下。这有点像传统数据库里的cursors(游标)。

scroll 搜索会及时制作快照。这个快照不会包含任何在初始阶段搜索请求后对index做的修改,这样将使得我们无法得到用户最近的更新行为。

search_after 分页的方式和 scroll 搜索有一些显著的区别,首先它是根据上一页的最后一条数据来确定下一页的位置,同时在分页请求的过程中,如果有索引数据的增删改查,这些变更也会实时的反映到游标上。

◆ 二、search_after 使用示例

search_after 通过维护一个实时游标来避免scroll的缺点,它可以用于实时请求和高并发场景。

检索第一页的查询如下所示:

代码语言:javascript复制
GET kibana_sample_data_ecommerce/_search
{ "size": 10, "query": { "match": { "customer_gender": "MALE"
 }
 }, "sort": [
 { "order_date": { "order": "asc"
 }
 },
 { "category.keyword": { "order": "asc"
 }
 }
 ]
}

输出结果如下图所示:

上述请求的结果包括每个文档的 sort 值数组。

这些 sort 值可以与 search_after 参数一起使用,以开始返回在这个结果列表之后的任何文档。例如,我们可以使用上一个文档的 sort 值并将其传递给 search_after 以检索下一页结果:

代码语言:javascript复制
GET kibana_sample_data_ecommerce/_search
{ "size": 10, "query": { "match": { "customer_gender": "MALE"
 }
 }, "search_after": [
 1651726858000, "Men's Clothing"
 ], "sort": [
 { "order_date": { "order": "asc"
 }
 },
 { "category.keyword": { "order": "asc"
 }
 }
 ]
}

在这里在 search_after 中,我们把上一个搜索结果的 sort 值放进来。输出结果如下图所示:

注意:当我们使用 search_after 时,from 值必须设置为 0 或者 -1。

search_after 不支持自由跳转到随机页面。它与 scroll API 非常相似,但也有所不同,search_after 参数是无状态的,它始终针对最新版本的搜索器进行解析。因此,排序顺序可能会在执行期间发生变化,具体取决于索引的更新和删除。

来源:

https://www.toutiao.com/article/7104063162550469131/?log_from=9ae084cbaaac5_1654658352405

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com

来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

  • 相关推荐 推荐文章
  • Nomad正在接管Kubernetes吗
  • MIT协议分布式文件系统,一个简单、方便的文件存储方案
  • 深入浅出 Nginx 实战与架构原理
  • 技术专家带你彻底掌握线程池
  • 基于GF的后台管理系统,完善的权限用户管理,致力于快速高效开发
  • Java 工程师相见恨晚的神兵利器和使用技巧
  • MySQL 故障诊断:MySQL 占用 CPU 过高问题定位及优化
  • 高可用架构之 Sentinel 的降级原理详解
  • .NET 6 从0到1使用Docker部署至Linux环境
  • 中高级程序员可能都不会使用spring-boot-starter-jdbc访问MySQL
  • 作为一名程序员,你还需要会画图

0 人点赞