Java?Api實現(xiàn)Elasticsearch的滾動查詢功能
解決ES每次只能查詢一萬條數(shù)據(jù)的問題
@Override
public List<ESHandleDto> getVisitorsNum(String startTime, String endTime, String schoolName, String typeFunction) throws IOException {
List<ESHandleDto> esHandleDtos = new ArrayList<>();
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(ElasticEnum.FUNCTIONLOG_INDEX.getValue());
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (StringUtils.hasText(schoolName)) {
boolQueryBuilder.must(QueryBuilders.termQuery("schoolName.keyword", schoolName));
}
if (StringUtils.hasText(typeFunction)) {
boolQueryBuilder.must(QueryBuilders.termQuery("typeFunction.keyword", typeFunction));
}
if (StringUtils.hasText(startTime) && StringUtils.hasText(endTime)) {
boolQueryBuilder.must(QueryBuilders.rangeQuery("createDate").gte(startTime + "T00:00:00.000Z").lte(endTime + "T23:59:59.000Z"));
}
BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();
shouldQuery.should().add(QueryBuilders.termQuery("description.keyword", "查詢學(xué)生信息表"));
shouldQuery.should().add(QueryBuilders.termQuery("description.keyword", "獲取學(xué)校訪客數(shù)據(jù)"));
boolQueryBuilder.must(shouldQuery);
sourceBuilder.sort("_doc", SortOrder.DESC);
sourceBuilder.size(10000);
sourceBuilder.query(boolQueryBuilder);
searchRequest.scroll(TimeValue.timeValueMinutes(1));
searchRequest.source(sourceBuilder);
// System.out.println(sourceBuilder.toString());
SearchResponse searchResponse = null;
try {
searchResponse = esConfig.restHighLevelClient().search(searchRequest, RequestOptions.DEFAULT);
} catch (Throwable e) {
throw new RuntimeException(e);
}
scrollHandle(searchResponse, esConfig, esHandleDtos, startTime, endTime);
return esHandleDtos;
}
public static void scrollHandle(SearchResponse searchResponse, ESConfig esConfig, List<ESHandleDto> esHandleDtos, String startTime, String endTime) {
SearchHits hits = searchResponse.getHits();
String scrollId = searchResponse.getScrollId();
SearchHit[] searchHits = hits.getHits();
//對結(jié)果集處理
List<FunctionLogElasticEntity> functionLogs = ESUtil.convertToFunctionLog(searchHits);
visitorsResultHandle(functionLogs, esHandleDtos, ESUtil.isMoreThanMonth(startTime, endTime));
//滾動查詢部分,將從第10001筆數(shù)據(jù)開始
while (searchHits != null && searchHits.length > 0) {
SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
searchScrollRequest.scroll(TimeValue.timeValueMinutes(1));
try {
searchResponse = esConfig.restHighLevelClient().scroll(searchScrollRequest, RequestOptions.DEFAULT);
} catch (Throwable e) {
throw new RuntimeException(e);
}
scrollId = searchResponse.getScrollId();
hits = searchResponse.getHits();
searchHits = hits.getHits();
//對結(jié)果集處理
functionLogs = ESUtil.convertToFunctionLog(searchHits);
visitorsResultHandle(functionLogs, esHandleDtos, ESUtil.isMoreThanMonth(startTime, endTime));
}
//清除滾動,否則影響下次查詢
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = null;
try {
clearScrollResponse = esConfig.restHighLevelClient().clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
throw new RuntimeException(e);
}
boolean succeeded = clearScrollResponse.isSucceeded();
System.out.println(succeeded);
}到此這篇關(guān)于Java Api實現(xiàn)Elasticsearch的滾動查詢的文章就介紹到這了,更多相關(guān)Java Elasticsearch滾動查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序
- Java使用ES?Client?調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機制
- Java利用ElasticSearch實現(xiàn)自動補全功能
- Java+ElasticSearch+Pytorch實現(xiàn)以圖搜圖功能
- Java中Elasticsearch 實現(xiàn)分頁方式(三種方式)
- 關(guān)于Java中配置ElasticSearch集群環(huán)境賬號密碼的問題
- Java如何使用elasticsearch進行模糊查詢
- JAVA使用ElasticSearch查詢in和not in的實現(xiàn)方式
- JAVA操作elastic?search的詳細過程
相關(guān)文章
java并發(fā)使用CountDownLatch在生產(chǎn)環(huán)境翻車剖析
這篇文章主要為大家介紹了java并發(fā)使用CountDownLatch在生產(chǎn)環(huán)境翻車的示例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
springboot整合redis過期key監(jiān)聽實現(xiàn)訂單過期的項目實踐
現(xiàn)在各種電商平臺都有自己的訂單過期時間設(shè)置,那么如何設(shè)置訂單時間過期呢,本文主要介紹了springboot整合redis過期key監(jiān)聽實現(xiàn)訂單過期的項目實踐,感興趣的可以了解一下2023-12-12
基于@RequestParam name和value屬性的區(qū)別
這篇文章主要介紹了@RequestParam name和value屬性的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
解讀java.lang.Character.isLetterOrDigit()的使用方式
這篇文章主要介紹了解讀java.lang.Character.isLetterOrDigit()的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Java二維數(shù)組實現(xiàn)數(shù)字拼圖效果
這篇文章主要為大家詳細介紹了Java二維數(shù)組實現(xiàn)數(shù)字拼圖效果,控制臺可以對空格進行移動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07

