优化 Query 查询效率之 Scroll 查询

如果涉及大量数据查询的话,一次性取回所有数据显得非常不可靠,一方面 ES 可能会被长时间占用,另一方面在网络连接方面也要一直保持连接状态。

以查询电商商品为例,如果当用户查看商品时候,将所有数据都返回,这将会使得用户等待时间比较长,那么这么体验是非常糟糕的。在处理传统这方面的需求可以通过自定义逻辑实现分页查询,到数据库中分批取数据。ES 同样也支持分页查询。

分页查询

给定需求:

使用分页查询方法查询电子商务订单的订单 ID 与下单日期。

_source 字段里面包括整个文档的所有字段,但是有时候并不是所有的字段都需要,因此使用 includes 过滤。

from 定义了偏移量为多少,size 表示要返回多少数据。下面的查询语句表示从 0 开始查,返回 10 条数据。

GET /kibana_sample_data_ecommerce/_search
{
  "_source": {
    "includes": [
      "order_id",
      "order_date"
    ]
  },
  "from": 0,
  "size": 10
}

查询结果:

{
  "took" : 3,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scroll是一种在ES中执行分页查询的方法,它使用游标来迭代查询结果,而不是像传统的基于页码的分页查询那样,每次查询都会重新计算结果。 使用scroll方法进行分页查询的一般步骤如下: 1. 执行一次初始查询,包括查询条件、排序方式、需要返回的字段等信息。 2. 在查询结果中获取一个scroll_id,该id用于后续的游标查询。 3. 使用scroll_id执行下一次查询,指定需要返回的文档数量和scroll_id,直到查询结果为空。 以下是一个使用scroll进行分页查询的示例: ``` POST /my_index/_search?scroll=1m { "size": 10, "query": { "match": { "title": "foo" } } } // 初始查询结果 { "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADwFgFvMnNzYU5mYUgzQXV6QTl4Q2N4Z0EAAAAPABbhbzJzc2FOZmFIM0F1ekE5eENjeGdBAADAAVpuG8tzc2FOZmFIM0F1ekE5eENjeGdBAADAAVp0G8t", "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 100, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "my_index", "_type": "_doc", "_id": "1", "_score": 0.2876821, "_source": { "title": "foo", "body": "bar" } }, ... ] } } // 使用scroll_id执行下一次查询 POST /_search/scroll { "scroll": "1m", "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADwFgFvMnNzYU5mYUgzQXV6QTl4Q2N4Z0EAAAAPABbhbzJzc2FOZmFIM0F1ekE5eENjeGdBAADAAVpuG8tzc2FOZmFIM0F1ekE5eENjeGdBAADAAVp0G8t" } // 下一次查询结果 { "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAADwFgFvMnNzYU5mYUgzQXV6QTl4Q2N4Z0EAAAAPABbhbzJzc2FOZmFIM0F1ekE5eENjeGdBAADAAVpuG8tzc2FOZmFIM0F1ekE5eENjeGdBAADAAVp0G8t", "took": 1, "timed_out": false, "hits": { "total": { "value": 100, "relation": "eq" }, "max_score": 0.2876821, "hits": [ { "_index": "my_index", "_type": "_doc", "_id": "11", "_score": 0.2876821, "_source": { "title": "foo", "body": "bar" } }, ... ] } } ``` 需要注意的是,scroll_id在每次查询时都会返回,因此在执行后续查询时需要将上一次查询结果中的scroll_id传递给下一次查询。另外,scroll参数用于指定scroll_id的有效时间,如果一个scroll_id在该时间内没有被使用,则会被ES自动清除。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值