elasticsearch默认输出最多一万条,超过就会报错:Result window is too large, from + size must be less than or equal to,但是日常部分数据查询是要会超过10000的尤其是对数据进行统计的情况下,数量必然会超过,那如何才能解决这个问题呢?我们需要对该配置进行调整。
报错样例:
2147483647(二十一亿四千七百四十八万三千六百四十七)是2147483646与2147483648之间的自然数,也是欧拉在1772年所发现的一个梅森素数,它等于2^31-1,是32位操作系统中最大的符号型整型常量。
在32位操作系统中,由于是二进制,其能最大存储的数据是1111111111111111111111111111111(31个1)。正因为此,体现在windows或其他可视系统中的十进制应该为2147483647。
所以一般32位游戏中,钱的数量最大为2147483647。例如:QQ农场 经验值最大数量为2147483647。
那这个数和ES有什么关系呢?你猜对了ES的最大返回也是2^31-1,也就是2147483647。他是通过index.max_result_window参数进行设置的,默认值是10000,这就是查询超过10000后报错的原因。
项目上使用的是filebeat进行数据采集,因此我们先查看下默认建好的索引是如何配置的:
我们通过kibana的管理界面对该值进行配置:
当然用curl 命令也是可以的:
curl -H "Content-Type: application/json" -XPUT http://192.168.47.1:9200/filebeat-7.9.1-2021.03.27-000001/_settings -d '{ "index" : { "max_result_window" : 2147483647}}'
修改完成后重新到索引查询界面进行查看会发现该配置已经进行更新
调整后再次进行查询已经不再报错,并且正常返回了相关数据
进行个计数统计返回行数为10692
和日志数据数量能完全匹配,问题解决。
总结:这样只是对单个索引做了调整,生产环境可能会有很多索引,如果一个个做的话就太费劲了,因此建议同类数据源采用索引模板来进行配置,把模板的参数进行调整,然后根据模板生成的索引也就不存在这个问题了。