ES深度分页与批量操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES深度分页与批量操作相关的知识,希望对你有一定的参考价值。
参考技术A 一、分页查询1.普通分页查询
2.深度分页
其实就是搜索的深浅度,比如第一页、第二页、第二十页等等,是浅分页。第一万页,第两万页等就是很深了
我们在获取第9999条到10009条数据的时候,其实每个分片都会拿到10009条数据,然后集合在一起,总共是30027条数据,针对这些数据再做排序处理,最后获得十条数据。
如此一来,搜索的太深,就会造成性能问题,会耗费内存和占用cpu。而且es为了性能,也不支持超过一万条数据以上的分页查询。解决深度分页问题,就是应该避免深度分页的操作(限制分页页数)。比如最多提供100页的展示等。
3.scroll滚动搜索
滚动搜索可以先查询出一些数据,然后再紧接着以此往下查询。在第一次查询的时候会有一个滚动id,相当于一个锚标记,随后再次滚动搜索需要上次的标记。每次搜索都是基于一个历史的数据快照,在查询期间,如果有数据变更,所有的内容不会变化
4.批量查询mget
未命中的结果也会返回json显示是否有值。
POST /_doc/_mget
"ids":[
"1008",
"1007",
"555"
]
ElasticSearch 深度搜索滚动搜索,批量操作
1、什么是深度分页
深度分页其实就是搜索的深浅度,比如第1页,第2页,第10页,第20页,是比较浅的;第10000页,第20000页就是很深了。
假设我们要搜索9999到10009的10条数据
假设shard数有3个,每个shard有10万条数据
如此一来,搜索得太深,就会造成性能问题,会消耗内存和占用CPU。而且影响ES的性能。ES不支持10000条以上分页查询。
那么如何解决深度搜索带来的问题呢?
比如最多只能提供100页的数据,第101页的数据就没有了,毕竟用户不会搜索的那么深。比如淘宝的搜索,最多只显示100页。
2、深度搜索9999到10009
可以发现,请求的数据条数太多了,默认最多返回10000条数据。
3、提升搜索量
修改最多10000条数据限制
可以看到,设置我10万已经成功
4、滚动搜索
1) 首次搜索
每页显示5条, 1m: 保持游标查询窗口1分钟
第二次搜索。
把上一次的scroll_id 赋值到本次scroll_id的值,时间是1分钟,如果过期了,首次搜索再调再调用1次。
优点: 解决了深度搜索的性能问题
缺点:滚动搜索有一个快照的概念,当数据更新时,不会马上在滚动搜索里显示。
5、批量搜索
_mget
6 、批量操作 bulk
向user2批量添加数据
JSON内容为
{"create":{"_index":"user2","_type":"_doc","_id": 2002}} {"id":"2002","nickname":"name-2002"} {"create":{"_index":"user2","_type":"_doc","_id": 2003}} {"id":"2003","nickname":"name-2003"} {"create":{"_index":"user2","_type":"_doc","_id": 2004}} {"id":"2004","nickname":"name-2004"}
上面的批量添加可以将index和type提取到url
index: 已经有了,进行修改; 否则,进行添加
因为2002已经存在,则进行修改操作; 2005和2006没有,则进行添加操作。
以上是关于ES深度分页与批量操作的主要内容,如果未能解决你的问题,请参考以下文章