问题
面试官:能说说es的深度分页的解决办法吗? 我:额,额,额 面试官:好今天面试就到这里吧!回去等待通知。
实验环境
- ES分页写法
- 指定
from
和size
即可。 from=0,size=10
等价于SQL中limit 0,10
```json GET /zipkin2:span-2022-03-29/_search { “from”: 0, “size”: 10 }
- 指定
2. Java Transport Client API
```java
SearchRequestBuilder searchRequestBuilder = transportClient.prepareSearch("zipkin2:span-2022-03-29")
.setFrom(from)
.setSize(size);
SearchResponse response = searchRequestBuilder.get();
常规分页问题
6.4.2官方文档中点出:from+size>
max_result_window
就不可以用from和size了。max_result_window
默认值为10000
Scroll解决方法
使用方式
步骤1:设置每页大小,指定scroll的存活时间
GET /zipkin2:span-2022-03-29/_search?scroll=1m
{
"size": 10
}
执行结果:
这里会返回一个
_scroll_id
,用作下次查询的入参
步骤2:进行之后每页数据查询
GET _search/scroll
{
"scroll":"1m",
"scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAABn6m7FkplSFdrWUhlVFZPVzdDYzQ2ZXI2cXcAAAAAAZ-pvRZKZUhXa1lIZVRWT1c3Q2M0NmVyNnF3AAAAAAGfqb8WSmVIV2tZSGVUVk9XN0NjNDZlcjZxdwAAAAABn6m-FkplSFdrWUhlVFZPVzdDYzQ2ZXI2cXcAAAAAAZ-pvBZKZUhXa1lIZVRWT1c3Q2M0NmVyNnF3"
}
scroll_id
:一直指定首次查询的scroll_id
scroll
:暂时理解,是每次为scroll_id
中正在使用的游标续命(这块我在后面解释)分片Scroll
分片Scroll其实就是原本的一个Scroll分为多个Scroll。可以指定字段进行分片。多个分片的Scroll数据加起来是之前一个Scroll的数据。不分片的情况
分片的情况
每次查询中指定scroll的作用
作用:就是为当前使用的search context(游标) 续命。若不指定
scroll
,当前的search context(游标)就被释放了。以我实验的结果,推测一下大致的模型
- 就是说,我原数据从不同的起点开始分成多个search context
- 最开始使用第一个search context。
- 若前面的search context过期啦,从接下来的search context开始走
- 每个search context有个游标。
Search After解决方法
Scroll可以解决深度分页问题,但是对于用户实时查询的场景,Scroll的价值太大了。
- 比如:我上一页的最后一条数据id=100,那我下一页就要从id>100查询。
对应SQL深度分页
```plsql上一页最后一个数据的id =100
select * from table_name where id>100 limit 10;
<a name="QO1AC"></a>
### 使用方式
在我的数据集中,有个timestamp_millis时间戳字段。当然这里用时间戳不合适。因为有重复
> 官方说一定要无重复字段:
> ![image.png](https://cdn.nlark.com/yuque/0/2022/png/1609516/1648626052767-67e84c2d-bfaf-495f-bf29-f9ac78542896.png#clientId=u1b7a1699-f2b0-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=170&id=ub6287b58&margin=%5Bobject%20Object%5D&name=image.png&originHeight=212&originWidth=719&originalType=binary&ratio=1&rotation=0&showTitle=false&size=52705&status=done&style=none&taskId=u07c6c66e-c110-4a15-9d3b-e27e25d56c2&title=&width=575.2)
<a name="GSAwP"></a>
#### 步骤1: 第1页查询不用`scroll after`
```java
{
"size": 10,
"sort": [
{
"timestamp_millis": {
"order": "desc"
}
}
]
}
步骤2:之后查询要按顺序一页一页的查询
GET /zipkin2:span-2022-03-29/_search
{
"size": 10,
"search_after": [1648598373627],#指定上次查询页中的最后一条结果的sort字段
"sort": [
{
"timestamp_millis": {
"order": "desc"
}
}
]
}