企业网站seo推广,可以注册邮箱的网站,提供大良营销网站建设,网站开发培训内容深度分页出现原因
当我们需要查询的数据页数特别大的时候#xff0c;比如from size 大于10000 的时候#xff0c;可能出现“window is too large” 异常#xff0c;如下网图#xff1a; 查询语句如下
{
query: {
bool: {
must: [
{…深度分页出现原因
当我们需要查询的数据页数特别大的时候比如from size 大于10000 的时候可能出现“window is too large” 异常如下网图 查询语句如下
{
query: {
bool: {
must: [
{
match_all: { }
}
],
must_not: [ ],
should: [ ]
}
},
from: 10000,
size: 10,
sort: [ ],
aggs: { }
}保存信息解释为当前信息超过了10000最大值虽然只查询了5条数据为什么elasticSearch需要计算10000 条数据因为查询的时候需要按照一定规则排序es如果不指定排序字段会更具相关度评分排序
图解深分页 添加了10万条记录在exam_info索引中并且elasticSearch是分布式部署的那么这10W数据会分布在不同的分片上假如又如上5个分片那么5个分片的数据一定会是近似均匀的 每个2w条。现在需要查询10001 到11000 的这一千条信息按照 A 字段排序那么我们查询的时候需要 查询出 shard1 ~ shard 4 每个分片中10001 ~ 11000 以A排序的所有数据排序后取前1000 个才能得到我们想要的数据因为shard1 ~ shard4 存储顺序并不以A排序所以我们要对每一个分片进行筛选后得到一个排序值
深分页异常
每次有序查询都是分片中单独查询在合并数据二次排序这个二次排序过程是在heap堆内存中进行的也就是单次查询数据越多内存中汇总的数据就更多数据越靠后需要排序的数据越多越容易导致OOMelasticSearch为了规避这种情况设置了一个阈值max_result_window 默认值是10000包含堆内存不被错误操作导致溢出
深分页解决方案一
规避错误将跳页功能删掉不让直接查看第N页的数据包括百度google淘宝等分页请求也是这么干的。如下 深度分页解决方案二滚动查询Scroll Search不推荐使用
在查询的时候带上scroll1m
GET aim_crowd_package_search905/_search?scroll1m
{{query:{bool:{must:[{match_all:{}}],must_not:[],should:[]}},from:5020,size:10,sort:[],aggs:{}}
}上述请求的结果包含一个_scroll_id可以通过这个id来完成下一批次的请求也就是elasticSearch帮我们圈了一批数据第一次查询给了一个标记位_scroll_id,之后的查询我们只需用代码这个elasticSearch会直接给我们查第二页的数据。如下图第二次带上scroll_id,查询语句
GET aim_crowd_package_search905/_search?scroll1m
{{query:{scroll_id:DXF1ZXJ5QW5kRmV0Y2gBAAAAAABSwL4WWmgwejdlZXNTZ1NZSWFYWDkzbTk2Zw,bool:{must:[{match_all:{}}],must_not:[],should:[]}},sort:[],aggs:{}}
}如上案例看出 scroll search 查询的智能一页一页给你返回这样可能不满足很多C端口业务场景而且elasticSearch为了限制资源对scrolls的数量又一定限制最多打开500个可以通过集群设置修改search.max_open_scroll_context不支持向前搜索每次搜后一页数据不适用于C端业务
深分页解决方案三Search After
第一点按一定规则排序例如自增id排序查询第二页带上 id X 此处X是第一页最后一条数据这样每次只需用查询一页数据就能满足分页查询第二点解决跳页问题 当跳页时候无法获取到前一页数据以上规则不适用缓存空间换时间每次查询预加载前后5页的id顺序数据前端只支持10个页面跳转这样无论那一页都能拿到前一页数据