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

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 带你读《Elastic Stack 实战手册》之29:——3.4.2.14.分页搜索(下)

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



search_after

 

如果说 scroll 是把上下文保存在服务端,而 search_after 要求数据中存在一个无重复,可以用于排序的字段,需要客户端每次传入上次查到的最后结果,然后获取其随后的数据。

 

由于随后的请求每次都是查询出来的,如果数据发生变化,就可能出现跨页面结果不一致的情况,为了防止这种情况,需要在请求中加一个参数来设置当前的索引状态保留时间。

 

POST /my-index-000001/_pit?keep_alive=1m

PIT 是 point in time 的简写,他是一个轻量级的视图。上述请求返回一个 ID:

{
  "id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
}

随后的请求中你需要带上他。可以通过下面的方式,获取第一页的结果,其中的特别之处在于,要指定进行排序的字段:


GET /_search
{
  "size": 10000,
  "query": {
    "match" : {
      "user.id" : "elkbee"
        }
  },
  "pit": {
        "id":  "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", 
        "keep_alive": "1m"
  },
  "sort": [ 
    {"@timestamp": "asc"}
  ]
}

在返回结果中,会携带 sort 字段的值,


{
  "hits" : {
    "hits" : [
      {
        "sort" : [
          4294967298                              
        ]
      }
    ]
  }
}

你需要在下次请求的时候带上他:


GET /_search
{
  "size": 10000,
  "query": ...
  "pit": {
        "id":  ...
        "keep_alive": ...
  },
  "sort": [
    {"@timestamp": "asc"}
  ],
  "search_after": [                                
    4294967298
  ]                    
}


类似 scroll,pit 请求返回的 ID 也可以手工清理。

 

最后我们总结一下每种分页方式的特点:

 

l from+size 支持跳页,不适合深分页

l scroll 不支持跳页,适合拉取大量数据,不适合大量并发

l search_after 不支持跳页,适合拉取大量数据

 

scroll 和 search_after 都可以用于深分页,search_after 需要提供一个主键字段进行排序,默认为 _shard_doc,它是 shard index 与 Lucene 内部 ID 的组合值。在服务端保存的上下文要比 scroll 小,目前官方推荐使用 search_after 代替 scroll。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
10月前
|
开发者
鸿蒙next版开发:ArkTS组件通用属性(Popup控制)
在HarmonyOS 5.0中,ArkTS提供了灵活的Popup控制属性,允许开发者创建和管理弹出窗口,用于显示额外信息、提示、表单等,增强用户交互体验。本文详解了Popup控制的通用属性,并提供了示例代码。通过bindPopup方法,可以将弹出窗口绑定到组件上,支持多种用途,如显示额外信息、表单提交和交互反馈。
528 1
|
12月前
|
自动驾驶 物联网 5G
深入解析5G NR(新无线电)及其主要特性
深入解析5G NR(新无线电)及其主要特性
1732 2
|
存储 消息中间件 运维
单体应用与微服务的优缺点
单体应用(monolith application)就是将应用程序的所有功能都打包成一个独立的单元,可以是 JAR、WAR、EAR 或其它归档格式。
484 0
|
安全 Java API
【新手必看】服务端集成网易云信IM 即时通讯
【新手必看】服务端集成网易云信IM 即时通讯
532 0
|
XML JSON PHP
PHP的生命周期:从诞生到现代Web开发
【5月更文挑战第31天】探索PHP的历史演变,了解其如何塑造网络技术。本文将引导您穿越时间的长廊,见证一个编程语言如何适应不断变化的技术需求,并持续影响全球数百万开发者和用户。
|
存储 编译器 C++
【C++】——string的模拟实现
【C++】——string的模拟实现
|
小程序 前端开发 Java
微信小程序|Springboot+Vue+Node开发实现医疗预约挂号系统
微信小程序|Springboot+Vue+Node开发实现医疗预约挂号系统
273 0
|
前端开发 JavaScript
竞态问题:深入理解与解决方案
竞态问题:深入理解与解决方案
642 0
|
存储 SQL 数据库
【数据库视频】对游标的认识
【数据库视频】对游标的认识
剑指offer 17. 删除链表中重复的节点
剑指offer 17. 删除链表中重复的节点
90 0