elasticsearch索引里面的数据-滚动查询

滚动查询
当搜索请求返回结果的单个页面时,滚动API可用于从单个搜索请求中检索大量结果。
目前支持滚动查询的客户端只有perl版和python版。
Perl: Search::Elasticsearch::Client::5_0::Bulk and Search::Elasticsearch::Client::5_0::Scroll
Python: elasticsearch.helpers.

search 请求返回一个单一的结果“页”,而 scroll API 可以被用来检索大量的结果(甚至所有的结果),就像在传统数据库中使用的游标 cursor。
滚动并不是为了实时的用户响应,而是为了处理大量的数据,例如,为了使用不同的配置来重新索引一个 index 到另一个 index 中去。
client 支持:Perl 和 Python

注意:从 scroll 请求返回的结果反映了 search 发生时刻的索引状态,就像一个快照。后续的对文档的改动(索引、更新或者删除)都只会影响后面的搜索请求。

方法1:直接使用es提供的scroll
第一步:向ES服务器发送如下GET请求。{}中的内容写在请求体中。其中,scroll=1m,设定scroll 在1min内保持打开状态
为了使用滚动,初始搜索请求应该在查询字符串中指定滚动参数,它告诉Elasticsearch应该保持“搜索上下文”存在多长时间,例如?scroll = 1m

POST /twitter/tweet/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

会得到如下类似的响应

{
"_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFlV2SjExVXdpUmwtNVFTOThNaWFRTVEAAAAAAAAAAhZVdkoxMVV3aVJsLTVRUzk4TWlhUU1RAAAAAAAAAAMWVXZKMTFVd2lSbC01UVM5OE1pYVFNUQAAAAAAAAAEFlV2SjExVXdpUmwtNVFTOThNaWFRTVEAAAAAAAAABRZVdkoxMVV3aVJsLTVRUzk4TWlhUU1R",
    "took": 879,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 136982,
        "max_score": 1,
        "hits": 
            
        ]
    }
,其中,_scroll_id在接下来的使用中非常重要,_scroll_id相当于传统数据库中的游标对象

第二步:向服务器发送如下GET请求。将返回的_scroll_id作为参数传给服务器。第二行的内容是写在请求体中。
获取到scroll id之后,就可以利用它进行下一次的批量查询了。
查询条件会继承上次的查询条件和参数,并且会保持scroll id的活跃,不让它过期

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
}
  • GET 或者 POST 可以使用
  • URL不应该包含 index 或者 type 名字——这些都指定在了原始的 search 请求中。
  • scroll 参数告诉 Elasticsearch 保持搜索的上下文等待另一个 1m
  • scroll_id 参数
    每次对 scroll API 的调用返回了结果的下一个批次知道没有更多的结果返回,也就是直到 hits 数组空了
    为了向前兼容,scroll_id 和 scroll 可以放在查询字符串中传递。scroll_id 则可以在请求体中传递。
    注意:初始搜索请求和每个后续滚动请求返回一个新的 _scroll_id,只有最近的 _scroll_id 才能被使用
    如果请求指定了聚合(aggregation),仅仅初始搜索响应才会包含聚合结果

第三步:重复第二步,直到hits中的数据为空。此时,该查询的所有数据获取完毕

第四步:删除该_scroll_id。清除scroll id(可选) GET请求如下所示:
当Scroll id到期时,会自己清除,但是当设置的过期时间过长时,这时又以及查询完毕数据,可以选择手动清除scroll id.
搜索上下文当 scroll 超时就会自动移除。但是保持 scroll 存活需要代价,如在前一节讲的那样,所以 scrolls 当scroll不再被使用的时候需要被用 clear-scroll 显式地清除:

DELETE /_search/scroll
{ 
  "scroll_id" : ["c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"]
}
多个 scroll ID 可按照数据传入:
DELETE /_search/scroll 
{ 
  "scroll_id" : ["c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1", "aGVuRmV0Y2g7NTsxOnkxaDZ"]
}
所有搜索上下文可以通过 _all 参数而清除:
DELETE /_search/scroll/_all
scroll_id 也可以使用一个查询字符串的参数或者在请求的body中传递。多个scroll ID 可以使用逗号分隔传入:
DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值