网站首页 > 技术文章 正文
Elasticsearch 分页查询有个特点,如果你写一个这样的查询语句:
{
"from" : 10, "size" : 10,
"query" : {}
}
Elasticsearch 会查询出前 20 条数据,然后截断前 10 条,只返回 10-20 的数据。
这样做带来的副作用很明显,数据量大的话,越到后面查询越慢。
所以针对大数据量的查询,要使用 scroll。这种方式相当于建立了一个游标,标记当前的读取位置,保证下一次查询快速取出数据。
但这两种方式都还有一个小坑需要注意,下面来详细说明。
from + size 方式
可能会出现的问题:
Result window is too large, from + size must be less than or equal to: [10000] but was [10010]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level setting.
这个报错信息其实已经说的很明确了,通过这种分页方式查询的最大值是 10000,超过 10000 就会报错。
解决办法也很简单,一是针对大数据量查询采用 scroll 方式;二是增加 index.max_result_window 值的大小,使其支持查询范围。
推荐使用 scroll 方式。
scroll 方式
可能会出现的问题:
Trying to create too many scroll contexts. Must be less than or equal to: [500]. This limit can be set by changing the [search.max_open_scroll_context] setting.
产生这个错误的原因是:
当有大量需要使用 scroll 的请求向 Elasticsearch 请求数据时,系统默认最大 scroll_id 数量是 500,当达到最大值时,导致部分请求没有 scroll_id 可用,产生报错。
特别是在高并发场景下,这种问题可能会更加常见。
解决办法可以增加 search.max_open_scroll_context 值的大小。
但这么解决并不好,更好的办法是查询完之后,及时清理 scroll_id。
# python
from elasticsearch import Elasticsearch
client = Elasticsearch(host, http_auth=(username, password), timeout=3600)
es_data = client.search(es_index, query_body, scroll='1m', size=100)
scroll_id = es_data['_scroll_id']
client.clear_scroll(scroll_id=scroll_id) # 清理方法
其实,即使我们不手动清理,等过期之后,游标也会自己释放,这跟使用时的参数有关。
比如 scroll='1m' 代表 1min 后会释放。
但就像我们使用其他资源一样,使用完之后及时释放,养成良好的编码习惯,系统才能更健壮。
参考文档:
- https://juejin.cn/post/6844903694241103879
- https://juejin.cn/post/6890891504630366215
猜你喜欢
- 2024-10-14 Excel表格太大时,怎么打印到一页上?
- 2024-10-14 写给Java应用开发者的Elasticsearch调优手册
- 2024-10-14 Excel表格太大时,怎么打印到一页上?收藏
- 2024-10-14 Excel中如何设置自动分页打印(excel表格怎么设置分页打印)
- 2024-10-14 还在浪费A4纸?按下Excel这个按钮,所有内容即可打印在同一页
- 2024-10-14 滑动页面时的控件设计规范——吸底&锚点
- 2024-10-14 ElasticSearch优化点简述(elasticsearch集群优化)
- 2024-10-14 一组Excel打印技巧,实用就好(excel打印技巧大全)
- 2024-10-14 打印设置用得好,天天追着幸福跑(打印基本设置)
- 2024-10-14 VBA实用代码赏析之八:页面、日期函数及选择的操作
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)