Elasticsearch中的三种分页策略深度解析:原理、使用及对比

假设一个名为products的索引,搜索名称中包含"apple"的产品,并且从第10条记录开始返回10条结果,按价格升序排序:

GET /products/_search
{
    "query": {
        "match": {
            "name": "apple"
        }
    },
    "from": 9,  // 注意,索引从0开始,所以第10条记录的索引是9
    "size": 10,
    "sort": [
        { "price": {"order": "asc"}}
    ]
}

from设置为9以跳过前9条记录,size设置为10以返回接下来的10条记录,并且结果按照price字段的升序排列。

Elasticsearch会返回如下响应:

{
  "took": 5,
  "timed\_out": false,
  "\_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 100,  // 假设总共有100条符合查询条件的产品
      "relation": "eq"
    },
    "max\_score": 1.0,
    "hits": [
      {
        "\_index": "products",
        "\_type": "\_doc",  // 注意:在Elasticsearch 7.x及之后的版本中,\_type字段通常被设置为"\_doc"
        "\_id": "10",
        "\_score": 1.0,
        "\_source": {
          "name": "Apple iPhone 12",
          "price": 999.99,
          // ... 其他字段
        }
      },
      // ... 其他9条产品的结果
      {
        "\_index": "products",
        "\_type": "\_doc",
        "\_id": "19",
        "\_score": 1.0,
        "\_source": {
          "name": "Apple Watch Series 6",
          "price": 399.99,
          // ... 其他字段
        }
      }
    ]
  }
}

优点
  • 直观易用:开发者可以很容易地指定要返回的记录范围和数量。
  • 实时性:适用于实时搜索场景,可以立即获取最新的查询结果。
缺点
  • 性能问题:当from值很大时,Elasticsearch需要遍历大量数据才能找到起始位置,然后返回size条记录。这会导致查询性能下降,尤其是在数据量很大的情况下。
  • 资源消耗:深度分页会消耗大量CPU和内存资源,对集群性能造成压力。

在这里插入图片描述

使用场景

适用于数据量不大、实时性要求高的场景。

方式二:scroll

scroll是一种基于游标的分页方式,它允许我们遍历大量数据而不需要在每次请求时重新计算整个搜索。

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值