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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 带你读《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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
12月前
|
索引
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)
带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)
|
12月前
|
运维 前端开发 Devops
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (4)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (4)
118 0
|
12月前
|
API
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (3)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (3)
110 0
|
12月前
|
存储 搜索推荐
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (2)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (2)
|
12月前
|
数据采集 存储 搜索推荐
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (1)
带你读《Elastic Stack 实战手册》之4:——3.2.1.企业搜索 (1)
220 0
|
12月前
|
缓存 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(4)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(4)
|
12月前
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(12)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(12)
|
12月前
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(7)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(7)
|
12月前
|
自然语言处理 算法 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(14)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(14)
|
12月前
|
自然语言处理 API 索引
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(16)
带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(16)