计算机系统应用教程网站

网站首页 > 技术文章 正文

elasticsearch 分页查询scroll 深分页

btikc 2024-10-16 08:22:33 技术文章 11 ℃ 0 评论

scroll 深分页

elasticsearch客户端实时分页一般使用from-size。如果有100条数据,按size=10共分10页,那么当用户查询第n页的时候,实际上elasticsearch是把前n页的数据全部找出来,再去除前n-1页最后得到需要的数据返回,查最后一页就相当于全扫描。且elasticsearch一般查询只支持最多查询出前1w条数据。所以离线大批量数据的处理业务或迁移不适合使用from-size方式查询。

为了解决上面的问题,elasticsearch提出了一个scroll滚动的方式。

scroll 类似于sql中的cursor,使用scroll,每次只能获取一页的内容,然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容,所以scroll并不适用于有跳页的情景。

# 游标查询
POST /ad/_search?scroll=1m
{
    "query":{
        "match_all":{

        }
    },
    "from":0,
    "size":1
}

# 输出结果
{
    "_scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw==",
    "took":0,
    "timed_out":false,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":{
            "value":11,
            "relation":"eq"
        },
        "max_score":1,
        "hits":[
            {
                "_index":"ad",
                "_type":"_doc",
                "_id":"1",
                "_score":1,
                "_source":{
                    "name":"phone 8",
                    "price":6000,
                    "color":"white",
                    "ad":"this is a white phone",
                    "label":[
                        "white",
                        "nice"
                    ]
                }
            }
        ]
    }
}

scroll=1m表示设置scroll_id保留1分钟可用。使用scroll必须要将from设置为0。size决定后面每次调用_search搜索返回的数量。

然后我们可以通过数据返回的_scroll_id读取下一页内容,每次请求将会读取下1页数据,直到数据读取完毕或者scroll_id保留时间截止:

# 通过_scroll_id读取下一页内容
POST /_search/scroll
{
    "scroll":"1m",
    "scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw=="
}

# 输出结果
{
    "_scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw==",
    "took":1,
    "timed_out":false,
    "terminated_early":true,
    "_shards":{
        "total":1,
        "successful":1,
        "skipped":0,
        "failed":0
    },
    "hits":{
        "total":{
            "value":11,
            "relation":"eq"
        },
        "max_score":1,
        "hits":[
            {
                "_index":"ad",
                "_type":"_doc",
                "_id":"2",
                "_score":1,
                "_source":{
                    "name":"xiaomi 8",
                    "price":4000,
                    "color":"red",
                    "ad":"this is a red phone",
                    "label":[
                        "white",
                        "xiaomi"
                    ]
                }
            }
        ]
    }
}

注意:请求的接口不再使用索引名了,而是 _search/scroll,其中GET和POST方法都可以使用。

scroll删除

根据官方文档的说法,scroll的搜索上下文会在scroll的保留时间截止后自动清除,但是我们知道scroll是非常消耗资源的,所以一个建议就是当不需要了scroll数据的时候,尽可能快的把scroll_id显式删除掉。清除指定的scroll_id:

DELETE
_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAcLKwWZlRuQUFFY2tSZ21DUEI4bTYzMF9hdw==

清除所有的scroll:

DELETE _search/scroll/_all

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表