開發(fā)利用水資源安徽seo優(yōu)化
滾動(dòng)查詢(Scroll Query)是 Elasticsearch 提供的一種機(jī)制,用于處理大量數(shù)據(jù)的查詢。它允許你在多個(gè)請求之間保持“游標(biāo)”,以便在后續(xù)請求中獲取更多的結(jié)果。
以下是滾動(dòng)查詢的基本工作原理:
1 初始查詢:
客戶端發(fā)送一個(gè)查詢請求給 Elasticsearch,并指定一個(gè)滾動(dòng)時(shí)間(scroll time)。
2 首次返回結(jié)果:
Elasticsearch會(huì)處理這個(gè)查詢請求,并將結(jié)果返回給客戶端。
除了返回查詢結(jié)果之外,還會(huì)返回一個(gè)特殊的“滾動(dòng)ID”(scroll ID)。
3 保持連接:
客戶端將這個(gè)滾動(dòng)ID保存下來,以便在后續(xù)請求中使用。
4 后續(xù)查詢:
在滾動(dòng)時(shí)間內(nèi),客戶端可以使用保存的滾動(dòng)ID來獲取更多的結(jié)果,而不需要重新發(fā)送完整的查詢請求。
客戶端發(fā)送一個(gè)滾動(dòng)請求,并提供之前收到的滾動(dòng)ID。
5 返回后續(xù)結(jié)果:
Elasticsearch會(huì)使用之前的滾動(dòng)ID來獲取接下來的結(jié)果,并將其返回給客戶端。
如果有更多的結(jié)果可用,它也會(huì)返回一個(gè)新的滾動(dòng)ID,以便在下一次請求中使用。
6 重復(fù)步驟4和步驟5:
客戶端可以在滾動(dòng)時(shí)間內(nèi)多次使用滾動(dòng)ID來獲取更多的結(jié)果,直到?jīng)]有更多的結(jié)果可用為止。
7 滾動(dòng)ID的失效:
一旦滾動(dòng)時(shí)間過期(在初始查詢時(shí)指定的時(shí)間),或者客戶端主動(dòng)關(guān)閉滾動(dòng)查詢,相應(yīng)的滾動(dòng)ID將失效,不再能用于獲取結(jié)果。
滾動(dòng)查詢的優(yōu)點(diǎn)在于,它允許你在多個(gè)請求之間保持連接狀態(tài),從而能夠處理大量數(shù)據(jù)而不會(huì)因?yàn)閱未握埱蟮臄?shù)據(jù)量過大而出現(xiàn)問題。
需要注意的是,滾動(dòng)查詢并不適用于實(shí)時(shí)查詢,因?yàn)樗鼤?huì)保持資源開銷,直到滾動(dòng)時(shí)間過期或者顯式關(guān)閉滾動(dòng)查詢?yōu)橹?。因?#xff0c;滾動(dòng)查詢通常用于離線批量處理或需要處理大量數(shù)據(jù)的情況。
@Test
public void searchScroll() {long gte = 0;long lt = 100000000;BoolQueryBuilder query = new BoolQueryBuilder();query.must(QueryBuilders.rangeQuery("createTime").gte(gte).lt(lt));NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();builder.withPageable(PageRequest.of(0, 500)); // 每次只處理500條數(shù)據(jù)builder.withQuery(query);// 查詢IndexCoordinates index = "student";SearchScrollHits<Student> hits = template.searchScrollStart(60000L,builder.build(),Student.class,index);String scrollId = hits.getScrollId();List<String> scrollIdList = new LinkedList<>();scrollIdList.add(scrollId);List<CheckItemCount> list = new LinkedList<>();while (hits.hasSearchHits()) {// 處理數(shù)據(jù)List<SearchHit<Student>> hitList = hits.getSearchHits();for (SearchHit<Student> hit : hitList) {// 處理數(shù)據(jù)}// 滾動(dòng)查詢下一頁hits = template.searchScrollContinue(scrollId, 60000L, Student.class, index);scrollId = hits.getScrollId();scrollIdList.add(scrollId);}// 清空滾動(dòng)查詢template.searchScrollClear(scrollIdList);
}