带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(上)

简介: 带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(上)

3.4.2.14.分页搜索


创作人张超

 

在查询场景中,从 Elasticsearch 中取得结果,根据不同场景,有多种不同的方式。

 

l 通过 from 、size 进行分页

l 通过 scroll 拉取大量数据

l 通过 search_after 拉取大量数据

 

每种方式有其各自的使用场景,或者说他们是为了解决某种场景而设计的。

 

from + size

 

搜索引擎的场景,类似 google 搜索,翻页操作一般是人为触发的,并且人的行为一般不会翻页太多,from+size 这种最经典的翻页模式是为了解决用户对于 TopN 的需求,用户希望找到TopN 个最匹配的文档。其使用方式类似 SQL 中的 LIMIT关键字,Elasticserach 使用 from 和 size 两个参数来控制翻页:

 

l size: 要返回的结果数量,默认为 10

l from: 要跳过的结果数量,默认为 0

 

如果每页显示 5 条结果,下面的命令可以得到 1-3 页的结果:


GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10

from 和 size 也可以放到查询请求的 body 中。


分页搜索实现方式是:

 

1、每个分片各自查询的时候先构建 from+size 的优先队列,然后将所有的文档 ID 和排序值返回给协调节点。

2、协调节点创建 size 为 number_of_shards * (from + size) 的优先队列,对数据节点的返回结果进行合并,取全局的 from+size 返回给客户端

 

这种工作模式的主要代价在于,协调节点需要等待所有分片返回结果,然后再全局排序。因此会创建非常大的优先队列,需要控制分页的深度,Elasticsearch 默认最多返回 10000 个文档。但是有些时候,用户需要遍历取回所有文档,甚至可以不关心排序。在数据库中取回全部结果可以使用游标查询的方式,类似的概念在 Elasticsearch 中叫做 scroll。


scroll

 

scroll 可以用于拉取全量数据,他的工作模式不需要像 from + size 一样全局排序,因此没有深分页的代价,例如 reindex 本质上就是 scroll+bulk。使用 scroll 可以简单的在查询语句中添加 scroll 参数:


POST /my-index-000001/_search?scroll=1m

上面的查询语句会返回一个 ID,后面可以根据这个 ID 顺序拉取结果:


POST /my-index-000001/_search/scroll                                                               
{
  "scroll" : "1m",                                                                 
  "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
} 

Elasticsearch 将查询后的上下文保存在服务端,因此客户端可以依据这个 scroll_id 依次获取后续的数据。



这个上下文也必然有一个生命周期,因为他会一直占用服务端资源。在这个例子中,我们设置 scroll 窗口保存 1 分钟的时间。1 分钟之内,你都可以使用 scroll_id 来拉取数据。当然,你也可以在拉取完成之后根据 scroll_id 手工清理上下文。


 《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.14.分页搜索(下) https://developer.aliyun.com/article/1230186

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
7月前
|
弹性计算 人工智能 小程序
阿里云2核4G服务器ECS详细介绍?收费标准、使用场景及性能全解析,2026年最新整理
本文全面解析2026年阿里云2核4G ECS服务器:涵盖u1/c9i/g9i等主流实例规格、¥199/年起的收费标准、实测性能(CPU≈8500分、IOPS≥1万)、WordPress建站、小程序后端、AI轻应用等典型场景,并提供选购建议与避坑指南,助你选对“黄金配置”。
|
XML JSON Java
服务接口定义
服务接口定义
551 3
|
Java 编译器 Apache
Java语言中的import语句:深入解析与应用
Java语言中的import语句:深入解析与应用
1664 0
|
运维 监控 微服务
DDD领域驱动设计实战-微服务架构演进的关键:边界(下)
微服务的设计要涉及到逻辑边界、物理边界和代码边界等。 逻辑边界:微服务内聚合之间的边界是逻辑边界。它是一个虚拟的边界,强调业务的内聚,可根据需要变成物理边界,也就是说聚合也可以独立为微服务。 物理边界:微服务之间的边界是物理边界。它强调微服务部署和运行的隔离,关注微服务的服务调用、容错和运行等。 代码边界:不同层或者聚合之间代码目录的边界是代码边界。它强调的是代码之间的隔离,方便架构演进时代码的重组。
492 0
DDD领域驱动设计实战-微服务架构演进的关键:边界(下)
|
文字识别 安全 语音技术
2.4计算机选购 计算机基础理论知识整理
2.4计算机选购 计算机基础理论知识整理
512 0
|
运维 Linux Shell
【Linux】定时任务-crontab
【Linux】定时任务-crontab1.1 定时任务crond介绍Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,安装完centos 6/7等linux操作系统之后,默认便会启动crond任务调度服务,crond服务也会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于“闹钟”一样。
3745 0
|
XML C# 数据格式
|
6天前
|
云安全 人工智能 运维
阿里云联动百位企业安全专家,共识Agent防御最佳实践
当Agent成为新员工,你的安全边界在哪里?
1908 5
阿里云联动百位企业安全专家,共识Agent防御最佳实践
|
4天前
|
存储 人工智能 关系型数据库
阿里云AI产品与云产品最新组合套餐:Token Plan、AI coding及云服务器和建站等组合优惠价
阿里云推出全新“算力+模型+应用”一站式云与AI组合套餐活动,覆盖从个人开发者到中大型企业的全场景需求。核心亮点为分三档定价的Token Plan订阅服务,支持Qwen3.8-Max-Preview大模型调用,错峰时段最低可享0.2折优惠。活动同步推出AI Coding、智能体部署、云电脑托管、0代码建站等十余类场景化组合,搭配99元/年的普惠云服务器、88元/年的入门数据库等经典特惠产品,还为企业提供1V1定制化AI转型方案,大幅降低了不同用户群体拥抱AI的技术门槛与采购成本。
636 110

热门文章

最新文章