滾動查詢(Scroll Query)是 Elasticsearch 提供的一種機(jī)制,用于處理大量數(shù)據(jù)的查詢。它允許你在多個請求之間保持“游標(biāo)”,以便在后續(xù)請求中獲取更多的結(jié)果。
以下是滾動查詢的基本工作原理:
1 初始查詢:
客戶端發(fā)送一個查詢請求給 Elasticsearch,并指定一個滾動時間(scroll time)。
2 首次返回結(jié)果:
Elasticsearch會處理這個查詢請求,并將結(jié)果返回給客戶端。
除了返回查詢結(jié)果之外,還會返回一個特殊的“滾動ID”(scroll ID)。
3 保持連接:
客戶端將這個滾動ID保存下來,以便在后續(xù)請求中使用。
4 后續(xù)查詢:
在滾動時間內(nèi),客戶端可以使用保存的滾動ID來獲取更多的結(jié)果,而不需要重新發(fā)送完整的查詢請求。
客戶端發(fā)送一個滾動請求,并提供之前收到的滾動ID。
5 返回后續(xù)結(jié)果:
Elasticsearch會使用之前的滾動ID來獲取接下來的結(jié)果,并將其返回給客戶端。
如果有更多的結(jié)果可用,它也會返回一個新的滾動ID,以便在下一次請求中使用。
6 重復(fù)步驟4和步驟5:
客戶端可以在滾動時間內(nèi)多次使用滾動ID來獲取更多的結(jié)果,直到?jīng)]有更多的結(jié)果可用為止。
7 滾動ID的失效:
一旦滾動時間過期(在初始查詢時指定的時間),或者客戶端主動關(guān)閉滾動查詢,相應(yīng)的滾動ID將失效,不再能用于獲取結(jié)果。
滾動查詢的優(yōu)點在于,它允許你在多個請求之間保持連接狀態(tài),從而能夠處理大量數(shù)據(jù)而不會因為單次請求的數(shù)據(jù)量過大而出現(xiàn)問題。文章來源:http://www.zghlxwxcb.cn/news/detail-714090.html
需要注意的是,滾動查詢并不適用于實時查詢,因為它會保持資源開銷,直到滾動時間過期或者顯式關(guān)閉滾動查詢?yōu)橹?。因此,滾動查詢通常用于離線批量處理或需要處理大量數(shù)據(jù)的情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-714090.html
@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ù)
}
// 滾動查詢下一頁
hits = template.searchScrollContinue(scrollId, 60000L, Student.class, index);
scrollId = hits.getScrollId();
scrollIdList.add(scrollId);
}
// 清空滾動查詢
template.searchScrollClear(scrollIdList);
}
到了這里,關(guān)于Java ES 滾動查詢的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!