es 分页查询

1、from和size是查询所有数据,然后剔除不要的部分

复制代码
POST /my_index/my_type/_search
{
    "query": { "match_all": {}},
    "from": 100,
    "size":  10
}

2、scroll是记录了一个读取的位置,保证下一次快速继续读取

scroll

查询阶段:将查询的结果集,doc_id列表保存在了一个上下文里

fetch阶段:根据size取回即可

复制代码
POST /twitter/tweet/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

Query阶段:每个shard将命中的结果( doc_id和_score) 按照 _score 顺序在上下文中创建一个优先队列快照,并通过scroll_id指向它,lastEmittedDoc指向上次访问的位置,最后将TOP(size)的doc id返回给协调节点。

Fetch阶段:协调节点将各个shard返回的结果再进行合并排序,最后通过doc_id查找返回结果的全量数据。之后更新各个分片上的上下文。

3、search_after

根据上一页最后一条数据来确定下一页的位置,因为每一页的数据依赖于上一页最后一条数据,所以无法完成跳页请求;在分页请求过程中如果有索引数据的增删改查,这些变更也会实时的反映到游标上。

核心思想记录上一次最后访问的位置

复制代码
GET twitter/_search
{
    "size": 10,
    "query": {
        "match" : {
            "title" : "es"
        }
    },
    "search_after": [124648691, "624812"],
    "sort": [
        {"date": "asc"},
        {"_id": "desc"}
    ]
}

ES的排序方式

在query阶段就要进行排序,不全量查询的情况下怎么排序的?

  • filter 查询 为 doc_id(Lucene 文件结构的当时索引时的先后顺序)
  • 按照相关性得分排序( _score)
  • 按照指定的字段排序 (term index中的顺序)

es默认分页查询方式

分页方式 性能 优点 缺点 场景
from + size 灵活性好,实现简单 深度分页问题 数据量比较小,能容忍深度分页问题
scroll 解决了深度分页问题 无法反应数据的实时性(快照版本)维护成本高,需要维护一个 scroll_id 海量数据的导出需要查询海量结果集的数据
search_after 性能最好不存在深度分页问题能够反映数据的实时变更 实现复杂,需要有一个全局唯一的字段连续分页的实现会比较复杂,因为每一次查询都需要上次查询的结果,它不适用于大幅度跳页查询

京东面试题:ElasticSearch深度分页解决方案

es分页查询原理_喂喂喂_java的博客-CSDN博客

相关推荐
eggwyw40 分钟前
完美解决phpstudy安装后mysql无法启动
数据库·mysql
LaughingZhu1 小时前
Product Hunt 每日热榜 | 2026-03-23
数据库·人工智能·经验分享·神经网络·chatgpt
2401_894241921 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python
java修仙传1 小时前
MySQL 事务隔离级别详解
数据库·mysql·oracle
Irissgwe1 小时前
MySQL存储过程和触发器专题
数据库·mysql·oracle
椎4951 小时前
Redis day02-应用-实战-黑马点评-短信登录
数据库·redis·spring
瀚高PG实验室2 小时前
易智瑞GeoScene Pro连接瀚高安全版数据库 458
数据库·安全·瀚高数据库
551只玄猫2 小时前
【数据库原理 实验报告3】索引的创建以及数据更新
数据库·sql·课程设计·实验报告·操作系统原理
加农炮手Jinx2 小时前
Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南
数据库·flutter·华为·postgresql·restful·harmonyos·鸿蒙