首页 > 其他分享 >es超过一万条的分页

es超过一万条的分页

时间:2025-01-11 11:01:07浏览次数:10  
标签:search 分页 after 查询 一万条 scroll es size

在 Elasticsearch(ES)中,当需要进行超过1万条数据的分页查询时,有几种常见的方法可以使用,每种方法都有其适用场景和优缺点。以下是几种主要的分页方法:


1.`from + size`分页
这是最基本的分页方式,通过指定`from`(起始位置)和`size`(每页数量)来获取数据。它简单易用,适用于数据量不大或不需要深度分页的场景。但是,当`from`值很大时,性能会下降,因为需要合并和排序所有分片返回的结果。ES 默认的`max_result_window`限制了最大分页数,通常为 10000,这意味着`from + size`的值不能超过这个限制。如果需要处理大量数据或深度分页,这种方式可能不是最佳选择。


2.`search_after`分页
`search_after`是一种基于游标的分页方法,适用于需要深度分页的场景。它通过使用上一页的最后一个文档的排序值来获取下一页数据,因此可以有效地避免深度分页的性能问题。这种方式的优点是性能较好,不存在深度分页问题,能够反映数据的实时变更。但是,它需要一个全局唯一的字段来排序,且实现相对复杂,每次查询都需要上次查询的结果。


使用示例

• 首次查询:

```json
   GET /my-index-000001/_search
   {
     "size": 10,
     "query": {
       "match": {
         "title": "elasticsearch"
       }
     },
     "sort": [
       {
         "id": {
           "order": "asc"
         }
       },
       {
         "_shard_doc": "asc"
       }
     ]
   }
   ```

• 后续查询:

```json
   GET /my-index-000001/_search
   {
     "size": 10,
     "query": {
       "match": {
         "title": "elasticsearch"
       }
     },
     "sort": [
       {
         "id": {
           "order": "asc"
         }
       },
       {
         "_shard_doc": "asc"
       }
     ],
     "search_after": [10000, 77050]  // 上一页最后一个文档的排序值
   }
   ```

3.`scroll`分页
`scroll`查询是一种在 ES 中扫描大量数据的常用方法。它通过在搜索结果中建立一个保持状态的`scroll_id`来实现。当您开始滚动时,ES 会返回第一批结果,并返回一个保持状态的 ID。使用此 ID,可以执行下一个滚动请求,以检索下一批结果。此过程可以重复进行,直到所有数据都被扫描完毕为止。`scroll`查询适用于需要遍历大量数据的场景,但牺牲了数据的实时性,因为`scroll`查询是基于初始查询时的快照数据。这种方式的优点是查询效率高,尤其适合于数据导出或批量处理,但缺点是需要维护`scroll_id`和历史快照,对服务器资源有一定的消耗。


使用示例

• 首次查询:

```json
   POST /my-index-000001/_search?scroll=1m
   {
     "size": 100,
     "query": {
       "match": {
         "message": "foo"
       }
     }
   }
   ```

• 后续查询:

```json
   POST /_search/scroll
   {
     "scroll": "1m",
     "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
   }
   ```

• 删除游标:

```json
   DELETE /_search/scroll
   {
     "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
   }
   ```

4.`PIT + search_after`分页
从 ES 7.10 版本开始,推荐使用`PIT + search_after`组合来实现深度分页。`PIT`(Point In Time)可以确保在查询过程中数据的一致性,而`search_after`则用于高效的分页查询。这种方式结合了`PIT`的一致性和`search_after`的高效性,适用于需要深度分页且对数据一致性有要求的场景。


使用示例

• 首次查询:

```json
   GET /my-index-000001/_search
   {
     "size": 10,
     "query": {
       "match": {
         "title": "elasticsearch"
       }
     },
     "sort": [
       {
         "id": {
           "order": "asc"
         }
       },
       {
         "_shard_doc": "asc"
       }
     ],
     "pit": {
       "keep_alive": "1m"
     }
   }
   ```

• 后续查询:

```json
   GET /my-index-000001/_search
   {
     "size": 10,
     "query": {
       "match": {
         "title": "elasticsearch"
       }
     },
     "sort": [
       {
         "id": {
           "order": "asc"
         }
       },
       {
         "_shard_doc": "asc"
       }
     ],
     "search_after": [10000, 77050],  // 上一页最后一个文档的排序值
     "pit": {
       "id": "39K1AwEPbXktaW5kZXgtMDAwMDAxFmZvclNBSGtUU0Uyc0xCb0pUdE1ZUkEAFkNfblFxQWwzVG5DZ0p6UmJUV2pNWWcAAAAAAAAATbUWYlNiMHU5MTFTbG1nWUZ1X3BpLXJCUQABFmZvclNBSGtUU0Uyc0xCb0pUdE1ZUkEAAA==",
       "keep_alive": "1m"
     }
   }
   ```

总结

• `from + size`:适用于数据量不大或不需要深度分页的场景。

• `search_after`:适用于需要深度分页且对数据实时性有要求的场景。

• `scroll`:适用于需要遍历大量数据的场景,但牺牲了数据的实时性。

• `PIT + search_after`:适用于需要深度分页且对数据一致性有要求的场景。

根据具体需求选择合适的分页方法,可以有效提高查询性能和数据一致性。

标签:search,分页,after,查询,一万条,scroll,es,size
From: https://blog.csdn.net/leijmdas/article/details/145072732

相关文章

  • 论文速读:SiamRPN++,利用深度网络实现Siamese视觉跟踪的进化
     原文标题:SiamRPN++:EvolutionofSiameseVisualTrackingwithVeryDeepNetworks中文标题:SiamRPN++:利用深度网络实现Siamese视觉跟踪的进化今天要介绍的是来自商汤团队发表在CVPR上一篇目标检测跟踪的文章。文章非常经典,直到现在也有很多地方正在使用该架构。详细精......
  • 获取ESP32的mac地址
    据说ESP32的mac地址可以作为设备的唯一ID,在esp-idf的esp_mac.h中定义了mac的几种类型typedefenum{ESP_MAC_WIFI_STA,/**<MACforWiFiStation(6bytes)*/ESP_MAC_WIFI_SOFTAP,/**<MACforWiFiSoft-AP(6bytes)*/ESP_MAC_BT,/*......
  • deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_2
    目录1、下载链接1.1、CSDN链接,==含权重文件直接使用==,建议直接下这个,还不限速。1.2Github链接:2、下载代码,下载预训练好的权重3、预测代码4、像素提取,或者说类别提取5、文档部分内容截图6、其他数据处理/程序/指导!!!最近做街景语义分割相关的工作,因为没有gpu训练模型,且......
  • SpringBoot3整合Swagger3时出现Type javax.servlet.http.HttpServletRequest not pres
    目录错误详情错误原因解决方法引入依赖修改配置信息 创建文件 访问 错误详情错误原因SpringBoot3和Swagger3版本不匹配解决方法使用springdoc替代springfox,具体步骤如下:引入依赖在pom.xml文件中添加如下依赖:<dependency><groupId>org.springdoc<......
  • 工厂MES系统是什么,一文带您快速掌握MES系统(附系统选型和客户案例)
    如果您想了解MES系统、如何选型系统、MES系统客户案例等,看这一篇就够了。尽管中国制造业在全球占据重要地位,但大部分制造企业仍面临诸多挑战:生产成本高、产品质量不稳定、生产交付效率低、设备使用寿命短、各部门数据孤岛等,成为限制企业发展的关键因素和市场竞争力。同时日益......
  • VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS Huawei (华为) 定制版
    VMwareESXi8.0U3cmacOSUnlocker&OEMBIOSHuawei(华为)定制版ESXi8.0U3c标准版,Dell(戴尔)、HPE(慧与)、Lenovo(联想)、Inspur(浪潮)、Cisco(思科)、Hitachi(日立)、Fujitsu(富士通)、NEC(日电)、Huawei(华为)、xFusion(超聚变)OEM定制版请访问原文链接:htt......
  • 如何用通俗易懂的方式解释大模型中的SFT,SFT过程需要大量标记的prompt和response吗?
    想象你在培训一个超级助理假设你新买了一个智能管家机器人,它已经看过海量的书籍和资料(这就是预训练过程)。但是呢,它还不太懂得"做人的艺术"——不知道该用什么语气说话、怎么回应你的需求。现在你要训练它成为一个得体的助理,这就是SFT要做的事情。SFT其实就是在教机器人"做......
  • Beyond Outcomes: Transparent Assessment of LLM Reasoning in Games
    题目超越成果:对LLM游戏推理的透明评估论文地址:https://arxiv.org/abs/2412.13602项目地址:https://visual-ai.github.io/gamebot摘要    大型语言模型(LLM)越来越多地部署在需要复杂推理的现实世界应用中。为了跟踪进展,需要强大的基准来评估它们在表面模式识别......
  • 关于此题[ABC367E] Permute K times倍增思想的一些总结
    传送门第一次接触到倍增思想是用来求lca时,为了避免一层一层往上爬浪费时间复杂度。再后来就是区间DP中一小类问题或者是部分图上问题可以用倍增来优化。那么这道题其实可以看作图上问题来使用倍增优化。看到这道题的数据范围,K达到了\(10^{18}\)量级,这让我们不得不思考log级别往......
  • 【解决方案】Windows 清理 C 盘,拒绝让 Desktop App 在 C 盘拉屎(配置/缓存/数据/预训练
    Windows有多磁盘管理,那又如何,许多程序为了节省上行带宽流量,会将大量数据/预训练模型默认下载到我们C盘的某个位置,动辄就是几GB甚至几十GB,有的干脆没有提供修改入口。安装系统时我特意为C盘留出200GB的空间,后来从职业装机那边了解到,对于个人和工作使用已经算非常大了。......