假设一个名为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
是一种基于游标的分页方式,它允许我们遍历大量数据而不需要在每次请求时重新计算整个搜索。