ES Scroll滚动查询

前端查询,经常有分页展示的需求,关系型数据库中往往都提供了类似于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字段 

ES Scroll滚动查询_第1张图片

接下来我们使用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"
    ]
}

 

 

你可能感兴趣的:(java,物联网,分布式,elasticsearch)