调用ElasticSearch做分页查询时报错:

QueryPhaseExecutionException[Result window is too large, from + size must be less than or equal to: [10000] but was [666000]. 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.]; }

提示用from+size方式有1万条数据查询的限制,需要更改index.max_result_window参数的值。

翻了下elasticsearch官网的文档:

index.max_result_window
The maximum value of from + size for searches to this index.Defaults to 10000.
Search requests take heap memory and time proportional to from + size and this limits that memory.
See Scroll or Search After for a more efficient alternative to raising this.

说是用传统方式(from + size)查询占用内存空间且比较消耗时间,所以做了限制。

问题是用scroll方式做后台分页根本行不通。

不说用scroll方式只能一页页的翻这种不人性化的操作。页码一多,scrollId也很难管理啊。

所以继续鼓捣传统方式的分页。

上网查了下设置max_result_window的方法,全都是用crul或者http方式改的。

后来无意间看到了一篇文档: https://blog.csdn.net/tzconn/article/details/83309516

结合之前逛elastic中文社区的时候知道这个参数是索引级别的。于是小试了一下,结果竟然可以了。

java代码如下:

public SearchResponse search(String logIndex, String logType, QueryBuilder query, 
List<AggregationBuilder> agg, int page, int size) {
page = page > 0 ? page - 1 : page;
TransportClient client = getClient();
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(logIndex.split(","))
.setTypes(logType.split(","))
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addSort("createTime", SortOrder.DESC); if (agg != null && !agg.isEmpty()) {
for (int i = 0; i < agg.size(); i++) {
searchRequestBuilder.addAggregation(agg.get(i));
}
}
updateIndexs(client, logIndex, page, size); SearchResponse searchResponse = searchRequestBuilder
.setQuery(query)
.setFrom(page * size)
.setSize(size)
.get();
return searchResponse;
} //更新索引的max_result_window参数
private boolean updateIndexs(TransportClient client, String indices, int from, int size) {
int records = from * size + size;
if (records <= 10000) return true;
UpdateSettingsResponse indexResponse = client.admin().indices()
.prepareUpdateSettings(indices)
.setSettings(Settings.builder()
.put("index.max_result_window", records)
.build()
).get();
return indexResponse.isAcknowledged();
}

搞定。

当然这段代码不好的地方在于:

每次查询超过10000万条记录的时候,都会去更新一次index。

这对原本就偏慢的from+size查询来说,更是雪上加霜了。

Java代码解决ElasticSearch的Result window is too large问题的更多相关文章

  1. elastic query match_all 数据目标超过10000条出错 Result window is too large

    起因 elastic做文本索引,match_all目标索引超过10000条时,出错 { "error": { "root_cause": [ { "t ...

  2. Result window is too large, from + size must be less than or equal to [10000]

    使用sql插件执行如下语句的时候报错http://10.127.0.1:9200/_sql?sql=select * from test limit 1000000 错误信息:{"error ...

  3. Result window is too large, from + size must be less than or equal to: [10000] but was [78440]. See the scroll api for a more efficient way to request large data sets

    {"error":{"root_cause":[{"type":"query_phase_execution_exception& ...

  4. 用java代码解决10元喝多少瓶汽水的问题

    问题:汽水2元一瓶,四个盖子换一瓶,两个空瓶一瓶,问10元可以喝几瓶?(不许借别人空瓶或瓶盖,但可以先喝汽水再付空酒瓶或瓶盖) 最近同事让笔者看了一道脑筋急转弯的数学题,当然不是很难,只要会加减法应该 ...

  5. 用java代码解决excel打开csv文件乱码问题

      Java 读取csv文件后,再保存到磁盘上,然后直接用Excel打开,你会发现里面都是乱码. 贴上代码: public class Test { public static void main(S ...

  6. Java代码操作Elasticsearch

    创建maven项目,导入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</a ...

  7. Elasticsearch 的分页报错 result window is too large

    检查自己分页查询的代码 Pageable pageable = new PageRequest(0, 10000); searchQuery.setPageable(pageable); // 分页效 ...

  8. 【max_result_window大小】 Result window is too large的问题

    方法一: 如果需要搜索分页,可以通过from size组合来进行.from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10, 如果搜索size大于10000,需要设置 ...

  9. 解决 Elasticsearch 超过 10000 条无法查询的问题

    解决 Elasticsearch 超过 10000 条无法查询的问题 问题描述 分页查询场景,当查询记录数超过 10000 条时,会报错. 使用 Kibana 的 Dev Tools 工具查询 从第 ...

随机推荐

  1. IOC和DI

    Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制(传统J ...

  2. redis修改端口号

    为redis分配一个8888端口,操作步骤如下: 1.$REDIS_HOME/redis.conf重新复制一份,重命名为redis8888.conf. 2.打开redis8888.conf配置文件,找 ...

  3. Android-画板

    在上一篇博客,Android-图像原理/绘制原理,讲解到绘图原理中,画布 + 画笔

  4. 如何将图片嵌入到Html中

    将图片内嵌入到Html中,最好的方法就是用Base64 string.例如:<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg ...

  5. 配置ssh使用socks代理

    ssh -o ProxyCommand='nc -x 127.0.0.1:1080 %h %p' username@server

  6. sql server partition分区与group by 分组

    例子:在一个StudentScore表中,有序号ID,班级ClassId,学生姓名Name,性别Sex,语文成绩ChineseScore,数学成绩MathScore,平均成绩AverageScore等 ...

  7. leetcode 字符串转整数(atoi)

    实现atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值. ...

  8. C语言/C++编程学习:和QT零距离接触的意义

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  9. NPOI+Json文件解析Excel

    记点笔记,加深印象!最近有个导入Excel工能需要完成,Excel列名是中文的,导入Excel我用的NPOI插件,如果不对Excel做解析,列名有可能会给我带来一些字符方面的麻烦,于是想到了一个比较l ...

  10. MVC框架入门准备(二) - 语言包类与工厂模式

    语言包类: 相关配置项 LANG_FOLDER : 语言包目录名,默认为Lang LANG_AUTO : 自动识别语言,默认为true DEFAULT_LANG : 默认语言,默认为zh-cn方法 取 ...