浙江建设厅网站,如何做好外贸网络营销,南阳建设网站招聘,公司找人做网站1. from size 浅分页
浅分页可以理解为简单意义上的分页。它的原理很简单#xff0c;就是查询前20条数据#xff0c;然后截断前10条#xff0c;只返回10-20的数据。这样其实白白浪费了前10条的查询。
GET test_dev/_search
{query: {bool size 浅分页
浅分页可以理解为简单意义上的分页。它的原理很简单就是查询前20条数据然后截断前10条只返回10-20的数据。这样其实白白浪费了前10条的查询。
GET test_dev/_search
{query: {bool: {filter: [{term: {age: 28}}]}},size: 10,from: 20,sort: [{timestamp: {order: desc},_id: {order: desc}}]
}其中from定义了目标数据的偏移值size定义当前返回的数目。默认from为0size为10即所有的查询默认仅仅返回前10条数据。
在这里有必要了解一下from/size的原理因为es是基于分片的假设有5个分片from100size10。则会根据排序规则从5个分片中各取回100条数据数据然后汇总成500条数据后选择最后面的10条数据。
做过测试越往后的分页执行的效率越低。总体上会随着from的增加消耗时间也会增加。而且数据量越大就越明显
2. scroll 深分页
fromsize查询在10000-50000条数据1000到5000页以内的时候还是可以的但是如果数据过多的话就会出现深分页问题。
为了解决上面的问题elasticsearch提出了一个scroll滚动的方式。 scroll 类似于sql中的cursor使用scroll每次只能获取一页的内容然后会返回一个scroll_id。根据返回的这个scroll_id可以不断地获取下一页的内容所以scroll并不适用于有跳页的情景。
GET test_dev/_search?scroll5m
{query: {bool: {filter: [{term: {age: 28}}]}},size: 10,from: 0,sort: [{timestamp: {order: desc},_id: {order: desc}}]
}scroll5m表示设置scroll_id保留5分钟可用。使用scroll必须要将from设置为0。size决定后面每次调用_search搜索返回的数量
然后我们可以通过数据返回的_scroll_id读取下一页内容每次请求将会读取下10条数据直到数据读取完毕或者scroll_id保留时间截止
GET _search/scroll
{scroll_id: DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAJZ9Fnk1d......,scroll: 5m
}注意请求的接口不再使用索引名了而是 _search/scroll其中GET和POST方法都可以使用。
scroll删除 根据官方文档的说法scroll的搜索上下文会在scroll的保留时间截止后自动清除但是我们知道scroll是非常消耗资源的所以一个建议就是当不需要了scroll数据的时候尽可能快的把scroll_id显式删除掉。
清除指定的scroll_id
DELETE _search/scroll/DnF1ZXJ5VGhlbkZldGNo.....1
清除所有的scroll
DELETE _search/scroll/_all1
3. search_after 深分页
scroll 的方式官方的建议不用于实时的请求一般用于数据导出因为每一个 scroll_id 不仅会占用大量的资源而且会生成历史快照对于数据的变更不会反映到快照上。
search_after 分页的方式是根据上一页的最后一条数据来确定下一页的位置同时在分页请求的过程中如果有索引数据的增删改查这些变更也会实时的反映到游标上。但是需要注意因为每一页的数据依赖于上一页最后一条数据所以无法跳页请求。
为了找到每一页最后一条数据每个文档必须有一个全局唯一值官方推荐使用 _uid 作为全局唯一值其实使用业务层的 id 也可以。
GET test_dev/_search
{query: {bool: {filter: [{term: {age: 28}}]}},size: 20,from: 0,sort: [{timestamp: {order: desc},_id: {order: desc}}]
}使用search_after必须要设置from0。这里我使用timestamp和_id作为唯一值排序。我们在返回的最后一条数据里拿到sort属性的值传入到search_after。
使用sort返回的值搜索下一页
GET test_dev/_search
{query: {bool: {filter: [{term: {age: 28}}]}},size: 10,from: 0,search_after: [1541495312521,d0xH6GYBBtbwbQSP0j1A],sort: [{timestamp: {order: desc},_id: {order: desc}}]
}4. 比较图
分页方式性能优点缺点场景from size低灵活性好实现简单深度分页问题数据量比较小能容忍深度分页问题scroll中解决了深度分页问题无法反应数据的实时性快照版本维护成本高需要维护一个 scroll_id海量数据的导出需要查询海量结果集的数据search_after高性能最好不存在深度分页问题能够反映数据的实时变更实现复杂需要有一个全局唯一的字段连续分页的实现会比较复杂因为每一次查询都需要上次查询的结果海量数据的分页