ES中默认最大查询结果为10000,大于10000时查不出结果,报错超过最大值,如把 from调到大于10000.

针对这个问题,有两种解决办法。

第一种,修改 max_result_window

很多人都用这种方法,简单粗暴。缺点是真的简单粗暴,对部分情形可用,但是对一些特殊情形可能就不行了。

PUT index/_settings

{
"index":{
"max_result_window":100000000
}
}

一篇可以参考的博客:关于搜索elasticsearch的数据条数大于10000的坑 max_result_window的两种设置方式

第二种,Scroll

scroll API 可以被用来检索大量的结果, 甚至所有的结果 ,就像在传统数据库中使用的游标 cursor。

本方法官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.2/search-request-scroll.html#scroll-search-context

中文翻译参考:https://blog.csdn.net/ctwy291314/article/details/82751898

以下代码是要实现获取ES中全部文档的nid字段,并将其存到文件中,是在单元测试中写的,NID是内部类。

具体代码:

public static class NID {
private String nid;
public String getNid() {
return nid;
}
public void setNid(String nid) {
this.nid = nid;
}
} @Test
public void testScroll() {
//RestHighLevelClient client = elasticClient.getRestHighLevelClient();
RestHighLevelClient client = esConfig.client();
// 初始化scroll
// 设定滚动时间间隔
// 这个时间并不需要长到可以处理所有的数据,仅仅需要足够长来处理前一批次的结果。每个 scroll 请求(包含 scroll 参数)设置了一个新的失效时间。
final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(1L));
SearchRequest searchRequest = new SearchRequest(esConfig.getCaterIndex()); // 新建索引搜索请求
searchRequest.scroll(scroll);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchAllQuery());
searchSourceBuilder.size(5000); //设定每次返回多少条数据
searchSourceBuilder.fetchSource(new String[]{"nid"},null);//设置返回字段和排除字段
searchRequest.source(searchSourceBuilder); SearchResponse searchResponse = null;
try {
searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
} int page = 0 ;
File outFile = new File("E://cater_nid.csv");//写出的CSV文件
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(outFile)); SearchHit[] searchHits = searchResponse.getHits().getHits();
page++;
System.out.println("-----第"+ page +"页-----");
for (SearchHit searchHit : searchHits) {
//System.out.println(searchHit.getSourceAsString());
String sourceAsString = searchHit.getSourceAsString();
NID t = JSON.parseObject(sourceAsString, NID.class);
writer.write(t.getNid());
writer.newLine();
} //遍历搜索命中的数据,直到没有数据
String scrollId = searchResponse.getScrollId();
while (searchHits != null && searchHits.length > 0) {
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(scroll);
try {
searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits();
if (searchHits != null && searchHits.length > 0) {
page++;
System.out.println("-----第"+ page +"页-----");
for (SearchHit searchHit : searchHits) {
//System.out.println(searchHit.getSourceAsString());
String sourceAsString = searchHit.getSourceAsString();
NID t = JSON.parseObject(sourceAsString, NID.class);
writer.write(t.getNid());
writer.newLine();
}
}
}
//清除滚屏
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);//也可以选择setScrollIds()将多个scrollId一起使用
ClearScrollResponse clearScrollResponse = null;
try {
clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
boolean succeeded = clearScrollResponse.isSucceeded();
System.out.println("succeeded:" + succeeded); writer.close(); } catch (IOException e) {
e.printStackTrace();
}
}

代码参考:https://www.cnblogs.com/chentop/p/10296517.html


RestHighLevelClient 之 Scroll的更多相关文章

  1. elasticsearch RestHighLevelClient 使用方法及封装工具

    目录 EsClientRHL 更新日志 开发原因: 使用前你应该具有哪些技能 工具功能范围介绍 工具源码结构介绍 开始使用 未来规划 git地址:https://gitee.com/zxporz/ES ...

  2. ElasticSearch High Level REST API【3】Scroll 滚屏

    ES中提供了 FROM/SIZE 分页,但这种分页有性能瓶颈. Scroll会以间隔时间滚屏的方式返回全部的查询数据,可以作为数据量很大的情况下,分页的一个替代方案 完整的示例如下: public v ...

  3. Spring与RestHighLevelClient

    Elasticsearch连接方式有两种:分别为TCP协议与HTTP协议 最近使用es比较多,之前使用一直是使用spring封装的spring-data-elasticsearch:关于spring- ...

  4. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

  5. MUI开发APP,scroll组件,运用到区域滚动

    最近在开发APP的过程中,遇到一个问题,就是内容有一个固定的头部和底部.         头部就是我们常用的header了,底部的话,就放置一个button,用来提交页面数据或者进入下一个页面等,效果 ...

  6. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...

  7. offset、client、scroll开头的属性归纳总结

    HTML元素有几个offset.client.scroll开头的属性,总是让人摸不着头脑.在书中看到记下来,分享给需要的小伙伴.主要是以下几个属性: 第一组:offsetWidth,offsetHei ...

  8. mui scroll和上拉加载/下拉刷新

    mui中 scroll和上拉加载/下拉刷新同时存在会出现两个滚动条 把/*   */ /* //mui页面鼠标拖动代码: mui('.mui-scroll-wrapper').scroll({ dec ...

  9. JavaScript学习笔记5 之 计时器 & scroll、offset、client系列属性 & 图片无缝滚动

    一.计时器 setInterval ( 函数/名称 , 毫秒数 )表示每经过一定的毫秒后,执行一次相应的函数(重复) setTimeout ( 函数/名称 , 毫秒数 ) 表示经过一定的毫秒后,只执行 ...

随机推荐

  1. Mongo Backup

    #!/bin/sh # This script is run on every mongo node. However, it checks to see if this node is the pr ...

  2. EMF保存CDATA

    /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public String ...

  3. [Algorithm] Tree Width with Level Width

    // --- Directions // Given the root node of a tree, return // an array where each element is the wid ...

  4. 007_FreeROTS队列

    (一)目的:进程间的通信 (二)队列创建 1. 动态创建队列,函数 xQueueCreate() QueueHandle_t xQueueCreate( UBaseType_t uxQueueLeng ...

  5. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  6. [题解] [Code+#1]Yazid 的新生舞会

    题面 题解 upd : \(cnt_i\) 代表值为 \(i\) 的个数 我们可以暴力枚举众数 \(k\) 把等于 \(k\) 的赋值成 1 , 不等于 \(k\) 的赋值成 -1 这样原序列就变成了 ...

  7. DBCA创建数据库

    工具/原料 oracle database 11g 步骤/方法 1 确保安装好oracle database 11g 2 打开命令提示符(运行中输入CMD打开 或是在 附件中点击打开) 3 输入dbc ...

  8. python 库 imgaug数据增强

    安装及详细使用方法介绍: https://blog.csdn.net/qq_38451119/article/details/82428612 pip install imgaug 失败解决方法: 提 ...

  9. 《你不知道的JavaScript(上)》笔记——作用域闭包

    当函数可以记住并访问所在的词法作用域时, 就产生了闭包, 即使函数是在当前词法作用域之外执行. function wait(message) { setTimeout( function timer( ...

  10. C#问答题与附解收集(三)

    post.get的区别 答: GET把参数包含在URL中,POST通过request body传递参数.GET请求在URL中传送的参数是有长度限制的,而POST没有.使用post提交的页面在点击[刷新 ...