elasticsearch提供的scroll可以实现一个请求返回所有命中记录,我们可以使用类似关系数据库中的游标的方式来获取命中的记录; scroll并不是为了实现实时的搜索请求,更多的是为了处理大量的数据,尤其适合从某一个index进行重新索引;
为了使用scroll,我们需要在url里通过scroll指定elasticsearch需要保留搜索结果的时间;
GET my_store_index/_search?scroll=1m { "_source": false, "query": { "match": { "name": "bj" } }, "size": 2 } { "_scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAb0Fk9Ca1RwWmNUUUoyNWttbE5aNnh5TGcAAAAAAAAG8xZPQmtUcFpjVFFKMjVrbWxOWjZ4eUxnAAAAAAAABvUWT0JrVHBaY1RRSjI1a21sTlo2eHlMZwAAAAAAAAb2Fk9Ca1RwWmNUUUoyNWttbE5aNnh5TGcAAAAAAAAG9xZPQmtUcFpjVFFKMjVrbWxOWjZ4eUxn", "took" : 2, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 25, "max_score" : 3.5134304, "hits" : [ ] } }我们使用上边请求返回的_scroll_id来获取下一页的数据;
GET _search/scroll { "scroll" : "1m", "scroll_id" : "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAdlFk9Ca1RwWmNUUUoyNWttbE5aNnh5TGcAAAAAAAAHZhZPQmtUcFpjVFFKMjVrbWxOWjZ4eUxnAAAAAAAAB2cWT0JrVHBaY1RRSjI1a21sTlo2eHlMZwAAAAAAAAdoFk9Ca1RwWmNUUUoyNWttbE5aNnh5TGcAAAAAAAAHaRZPQmtUcFpjVFFKMjVrbWxOWjZ4eUxn" }此种分页方式的特点
首次查询通过query string参数指定scroll的时间,elasticsearch会自动生成一个scroll并返回对应的id;
此查询是一种有状态的查询,不会实时响应索引变化;
每次请求返回的记录数通过首次请求设置的size参数控制;
返回scroll对应的全部记录之后再查询就返回空数组;