前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch:使用search after实现深度分页

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

作者头像
IT大咖说
发布2022-07-26 19:41:40
7K0
发布2022-07-26 19:41:40
举报
文章被收录于专栏:IT大咖说

对于大量的数据而言,我们尽量避免使用 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大咖说的热心支持!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ◆ 一、Elasticsearch常见分页方式
  • ◆ 二、search_after 使用示例
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档