Java使用ES?Client?調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機制
Elasticsearch"滾動查詢"(Scrolling)的機制的與Java使用ES Client 調(diào)用滾動查詢
前言
ES在進行普通的查詢時,默認只會查詢出來10條數(shù)據(jù)。我們通過設(shè)置es中的size可以將最終的查詢結(jié)果從10增加到10000。如果需要查詢數(shù)據(jù)量大于es的翻頁限制或者需要將es的數(shù)據(jù)進行導(dǎo)出又當(dāng)如何?
Elasticsearch提供了一種稱為"滾動查詢"(Scrolling)的機制,用于處理大型數(shù)據(jù)集的分頁查詢。滾動查詢允許在持續(xù)的時間段內(nèi)保持一個活動的搜索上下文,然后使用滾動ID進行迭代檢索結(jié)果。滾動查詢和關(guān)系型數(shù)據(jù)庫中的游標(biāo)有點類似,因此也叫游標(biāo)查詢
1. 滾動查詢的一般步驟
1.1 發(fā)起初始搜索請求,返回命中結(jié)果和滾動ID
scroll=5m表示每個滾動查詢的有效時間為5分鐘
POST /your_index/_search?scroll=5m
{
"size": 100, // 每次返回的結(jié)果數(shù)量
"query": { ... } // 查詢條件
}命中結(jié)果:
{
"_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
"hits": {
"total": {
"value": 10000,
"relation": "eq"
},
"hits": [ ... ] // 檢索到的文檔
}
}
示例:

1.2 使用滾動ID檢索下一頁結(jié)果
POST /_search/scroll
{
"scroll": "5m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}示例:
POST /_search/scroll
{
"scroll": "5m",
"scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFDJPRXc0WWdCY1BLWlo1MTk4MmR3AAAAAAAAAXYWcWgwSW5CQUtScEd2T2QtRGtYaWliQQ=="
}
1.4 重復(fù)執(zhí)行直到?jīng)]有檢索結(jié)果返回
Elasticsearch將返回下一頁結(jié)果和一個新的滾動ID??梢愿鶕?jù)需要重復(fù)這個步驟,直到?jīng)]有更多結(jié)果為止
1.5 清除滾動上下文釋放資源
滾動查詢結(jié)束后,您可以通過發(fā)送一個清除滾動上下文的請求來釋放資源:
DELETE /_search/scroll
{
"scroll_id": [
"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
]
}以上為滾動查詢進行分頁檢索的基本過程。在每個滾動請求中,都需要提供先前滾動請求返回的滾動ID。這樣Elasticsearch才能夠維護搜索上下文并返回正確的結(jié)果
2.Java Elasticsearch客戶端執(zhí)行滾動查詢
public static void main(String[] args) {
long start = System.currentTimeMillis();
//構(gòu)建es HttpHost對象
HttpHost httpHost1 = new HttpHost("192.168.1.1", 9200, "http");
// 滾動時間窗口
long scrollTime = 1L;
// 每次返回的文檔數(shù)量
int batchSize = 20000;
//索引名
String indexName = "你的索引名稱";
try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(httpHost1))) {
//構(gòu)建查詢請求
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.boolQuery());
searchSourceBuilder.size(batchSize);
//設(shè)置查詢返回字段
String[] includes = {};
searchSourceBuilder.fetchSource(includes, null);
// 滾動查詢請求
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(searchSourceBuilder);
//設(shè)置請求滾動時間窗口時間
searchRequest.scroll(TimeValue.timeValueMinutes(scrollTime));
//執(zhí)行首次檢索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
//首次檢索返回scrollId,用于下一次的滾動查詢
String scrollId = searchResponse.getScrollId();
//獲取首次檢索命中結(jié)果
SearchHit[] searchHits = searchResponse.getHits().getHits();
//計數(shù)
int count = 0;
// 處理第一批結(jié)果
for (SearchHit hit : searchHits) {
// 處理單個文檔
JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());
System.out.println("====對首次請求的進行處理,當(dāng)前計數(shù):" + count++);
}
// 處理滾動結(jié)果
while (searchHits != null && searchHits.length > 0) {
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
scrollRequest.scroll(TimeValue.timeValueMinutes(scrollTime));
searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getHits().getHits();
for (SearchHit hit : searchHits) {
JSONObject dataJson = (JSONObject) JSON.parse(hit.getSourceAsString());
System.out.println("====滾動查詢,當(dāng)前計數(shù):" + count++);
}
}
// 清理滾動上下文
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
boolean succeeded = clearScrollResponse.isSucceeded();
long end = System.currentTimeMillis();
System.out.println("共執(zhí)行時間:" + (end - start) / 1000 + " s");
} catch (Exception e) {
System.out.println("===error==" + e.getMessage());
e.printStackTrace();
}
}3. SpringDataElasticsearch滾動查詢
import org.elasticsearch.action.search .*;
import org.elasticsearch.client .*;
import org.elasticsearch.common.unit .*;
import org.elasticsearch.index.query .*;
import org.elasticsearch.search .*;
import org.elasticsearch.search.builder .*;
import org.springframework.beans.factory.annotation .*;
import org.springframework.data.elasticsearch.core .*;
import org.springframework.data.elasticsearch.core.query .*;
public class ScrollSearchExample {
@Autowired
private ElasticsearchOperations elasticsearchOperations;
public void performScrollSearch() {
String scrollTime = "1m"; // 滾動時間窗口
int batchSize = 100; // 每次返回的文檔數(shù)量
QueryBuilder queryBuilder = QueryBuilders.matchQuery("field", "value");
NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
searchQuery.withQuery(queryBuilder).withPageable(PageRequest.of(0, batchSize)).build();
SearchResponse searchResponse = elasticsearchOperations.startScroll(
scrollTime,
searchQuery,
YourEntityClass.class,
IndexCoordinates.of("your_index")
);
String scrollId = searchResponse.getScrollId();
SearchHits<YourEntityClass> searchHits = searchResponse.getSearchHits();
// 處理第一批結(jié)果
for (SearchHit<YourEntityClass> hit : searchHits) {
YourEntityClass entity = hit.getContent();
// 處理單個文檔
}
// 處理滾動結(jié)果
while (searchHits != null && searchHits.hasSearchHits()) {
searchResponse = elasticsearchOperations.continueScroll(scrollId, scrollTime, YourEntityClass.class);
scrollId = searchResponse.getScrollId();
searchHits = searchResponse.getSearchHits();
for (SearchHit<YourEntityClass> hit : searchHits) {
YourEntityClass entity = hit.getContent();
// 處理單個文檔
}
}
// 清理滾動上下文
elasticsearchOperations.clearScroll(scrollId);
}
}到此這篇關(guān)于Java使用ES Client 調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機制的文章就介紹到這了,更多相關(guān)java Elasticsearch滾動查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序
- Java?Api實現(xiàn)Elasticsearch的滾動查詢功能
- 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)文章
springboot項目監(jiān)控開發(fā)小用例(實例分析)
這篇文章主要介紹了springboot項目監(jiān)控開發(fā)小用例,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解
這篇文章主要介紹了MyBatis-Plus QueryWrapper及LambdaQueryWrapper的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
idea 在springboot中使用lombok插件的方法
這篇文章主要介紹了idea 在springboot中使用lombok的相關(guān)資料,通過代碼給大家介紹在pom.xml中引入依賴的方法,本文給大家介紹的非常詳細,需要的朋友可以參考下2021-08-08
mybatis-plus批量更新updateBatchById問題
這篇文章主要介紹了mybatis-plus批量更新updateBatchById問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

