Elasticsearch 滚动查询请求

在Elasticsearch中,一次查询只能得到一次独立的结果,在分页中这是很不方便的。当用Elasticsearch进行第n页查询的时候,Elasticsearch在内部查询了从开始到n页的所有数据,只是在返回的时候抛弃了前面n-1页的内容。这样对查询大量数据的时候是非常不方便的。但Elasticsearch提供了滚动API来解决此问题

 

为了使用scroll,在第一次搜索请求的查询中指定scroll参数,它告诉Elasticsearch需要保持搜索的上下文多长时间。例如:

GET http://x:9200/20001_event/_search?scroll=1m&pretty=
Body 类型 : application/json
{
  "size": 20,
  "query": {
    "match": {
      "person_id": "6042"
    }
  },
  "sort": [
    "_doc"
  ]
}

保持时间的参数如下所示:□y——年□M——月□w——周□d——天□h——小时□m——分钟□s——秒

返回值中包含一个scroll_id,可将这个ID传递给scroll API来搜索下一个批次的内容。在下一次查询中的实例如下。

GET http://x:9200/_search/scroll?pretty=
Body 类型 : application/json
{
  "scroll" : "1m", 
  "scroll_id" : "xxx"
}

每一次调用scroll查询返回下一批的结果,直到返回为空("hits":[]),表示查询完成。

 

scroll参数告诉Elasticsearch应保持多长时间的搜索。这个值并不需要长到可以处理所有的数据,只要够处理前一批次结果的时间。每一个滚动请求设置一个新的有效时间。

当滚动超时的时候会自动删除搜索上下文,然而保持滚动打开会产生成本,所以当scroll不再被使用的时候需要显式地清除滚动接口。方法如下。

DELETE http://x:9200/_search/scroll
Body 类型 : application/json
{
    "scroll_id": ["xxx"]
}

 

posted @ 2022-06-20 13:58  草木物语  阅读(148)  评论(0编辑  收藏  举报