前端查询,经常有分页展示的需求,关系型数据库中往往都提供了类似于top limit这样的语义来支持分页查询。elasticsearch中也提供了from szie这两个参数来支持分页查询,但是当一个索引中文档数非常巨大的时候,通过from、size来实现分页查询对性能影响很大。所以,ES提供了滚动查询API来提高查询性能,下面介绍下Scroll API的基本用法。
首先新建一个索引,插入一些测试数据
PUT test_scroll
{
"settings": {
"number_of_shards": 1
, "number_of_replicas": 0
},
"mappings": {
"properties": {
"id":{
"type": "keyword"
},
"content":{
"type": "text"
}
}
}
}
然后,我们新建一个查询,ES称之为初始化查询。假设我们需要一次返回10条数据,可以新建如下查询:
POST test_scroll/_search?scroll=1m
{
"size": 10,
"query": {
"match_all": {}
}
}
执行成功后,返回的结果里有一个_scroll_id字段
接下来我们使用scroll api进行后续的滚动查询,其中要指定前一次查询返回的_scroll_id 。其中scroll参数是告诉ES要保留这个查询上下文(可以理解为session)多长时间,示例 1m 代表1分钟。The search context is created by the initial request and kept alive by subsequent requests。
POST _search/scroll
{
"scroll":"1m",
"scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAucIWajJ0MFVzTy1RVWEtWXRGWjQ1RzZjZw=="
}
假设我们想手动清除这个滚动上下文(scroll search context),可以利用下面的API:
DELETE /_search/scroll
{
"scroll_id" : [
"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB"
]
}