在 Elasticsearch 中,分页技术是处理大量搜索结果时的关键功能,尤其在需要优化性能或处理深度分页时。以下是三种主要的分页方法: from/size 、 scroll API 和 search_after ,以及它们的详细对比和适用场景。
---
1.`from/size`分页
原理
`from/size`是最简单的分页方法,通过指定`from`和`size`参数来跳过指定数量的文档并返回指定数量的结果。
实现细节
• `from`:跳过的文档数量。
• `size`:每页返回的文档数量。
示例
请求:
```json
GET /index_name/_search
{
"from": 0,
"size": 10,
"query": {
"match_all": {}
}
}
```
响应:
```json
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 100,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "index_name",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"field1": "value1",
"field2": "value2"
}
},
// 其他文档...
]
}
}
```
优点
• 简单易用,适合用户界面分页。
• 支持随机访问任意页。
缺点
• 性能随`from`值增大而下降。
• 默认限制为 10,000 条结果。
适用场景
• 结果数量较少的场景。
• 用户界面分页。
---
2.`scroll`API
原理
`scroll`API 通过创建一个快照(snapshot)来保持搜索上下文,允许遍历大量数据。
实现细节
1. 初始化搜索上下文:首次请求返回初始结果和`_scroll_id`。
2. 滚动请求:使用`_scroll_id`获取更多结果。
3. 清理上下文:完成滚动后需清理上下文。
示例
初始化请求:
```json
POST /index_name/_search?scroll=1m
{
"size": 100,
"query": {
"match_all": {}
}
}
```
响应:
```json
{
"_scroll_id": "abc123...",
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": {
"value": 1000,
"relation": "eq"
},
"hits": [
{
"_index": "index_name",
"_type": "_doc",