一、Scroll滾動查詢介紹
ElasticSearch中在進(jìn)行普通的查詢時,默認(rèn)只會查詢出來10條數(shù)據(jù)。我們通過設(shè)置ElasticSearch中的size
可以將最終的查詢結(jié)果從10
增加到10000
。但這時候如果我們需要查詢的數(shù)據(jù)大于10000條怎么辦呢?這時候有兩種方法:深度分頁
和滾動查詢
。在這里我們優(yōu)選選擇滾動查詢
,因為深度分頁越往后查性能越低,極其耗費內(nèi)存和CPU。
在介紹滾動查詢之前,我們先簡單了解下深度分頁
深度分頁其實就是用from
和size
兩個關(guān)鍵字實現(xiàn)的。如下圖所示,from
關(guān)鍵字可以指定從哪個位置開始搜索,size
關(guān)鍵字可以指定搜索幾條數(shù)據(jù),但深度分頁的搜索很深,對性能方面會帶來很大的影響, 因此這種方式不推薦
使用。
GET /online_house_achieve/house/_search
{
"query": {"match_all": {}},
"from": 10000,
"size": 5
}
然后我們來了解下滾動查詢
滾動查詢,和關(guān)系型數(shù)據(jù)庫中的游標(biāo)
有點類似,因此也叫游標(biāo)查詢
。也相當(dāng)于一個快照
,它是ElasticSearch中提供的一種查詢大數(shù)據(jù)量
的方式。
二、Kibana上操作
要想使用滾動查詢,我們只需要在_search
后面加上scroll
就好了。
GET /online_house_achieve/house/_search?scroll=1m
{
"query": {"match_all": {}},
"size": 1
}
這里有幾個注意點
- scroll表示這是一個scroll滾動查詢。
- scroll=
1m
表示查詢的結(jié)果數(shù)據(jù)在ElasticSearch服務(wù)器中過期時間為1min
。 - 查詢完會返回一個
_scroll_id
,該字段其實就相當(dāng)于一個書簽,在我們之后的查詢中需要帶著這個書簽,就可以一直往后根據(jù)設(shè)置的size大小獲取數(shù)據(jù)(前提是在設(shè)置的過期時間之內(nèi))。那問題來了,我們該如何使用這個
_scroll_id
實現(xiàn)進(jìn)一步的滾動查詢
呢?我們直接看下面代碼。
GET /_search/scroll/
{
"scroll":"1m",
"scroll_id":"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAa5Fm9hLW9TeGtTU2NTWEI2bFpNbEJ0clEAAAAAAAAGtxZvYS1vU3hrU1NjU1hCNmxaTWxCdHJRAAAAAAAABroWb2Etb1N4a1NTY1NYQjZsWk1sQnRyUQAAAAAAAAa4Fm9hLW9TeGtTU2NTWEI2bFpNbEJ0clEAAAAAAAAGuxZvYS1vU3hrU1NjU1hCNmxaTWxCdHJR"
}
將獲取的scroll_id
作為條件繼續(xù)查詢即可,不需要再指定索引和類型。因為scroll_id
具有唯一性
,在過期時間內(nèi),之后查詢的scroll_id是不變的。
三、SpringBoot中操作
1.先在pom.xml里面引入依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.然后在SpringBoot項目中增加以下配置。
這里我是用HTTP的方式進(jìn)行連接,端口是9200。如果你們是用TCP方式進(jìn)行連接的話,端口記得改成9300。文章來源:http://www.zghlxwxcb.cn/news/detail-796788.html
@Configuration
public class ESRestClientConfig extends AbstractElasticsearchConfiguration {
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("127.0.0.1:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
3.然后寫單元測試代碼,實現(xiàn)滾動查詢。文章來源地址http://www.zghlxwxcb.cn/news/detail-796788.html
@Test
public void testESScroll() throws IOException {
SearchRequest searchRequest = new SearchRequest();
// 構(gòu)造ElasticSearch查詢條件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.size(1).query(QueryBuilders.matchAllQuery());
// 設(shè)置scroll超時時間(10min)
Scroll scroll = new Scroll(TimeValue.timeValueMinutes(10L));
// 指定查詢的索引和類型
searchRequest.indices("online_house_achieve").types("house").scroll(scroll);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
// 獲取第一次查詢的結(jié)果,并拿到scrollId滾動id
SearchHit[] scrollHits = response.getHits().getHits();
for (SearchHit hit : scrollHits) {
logger.info(hit.getSourceAsString());
}
//記錄滾動id。
String scrollId = response.getScrollId();
//滾動查詢部分,將從第2條數(shù)據(jù)開始取。
scrollHits = response.getHits().getHits();
while (scrollHits != null && scrollHits.length > 0 ) {
//構(gòu)造滾動查詢條件
SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
searchScrollRequest.scroll(scroll);
//響應(yīng)必須是上面的響應(yīng)對象,需要對上一層進(jìn)行覆蓋。
response = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
scrollId = response.getScrollId();
scrollHits = response.getHits().getHits();
for (SearchHit hit : scrollHits) {
logger.info(hit.getSourceAsString());
}
}
// 數(shù)據(jù)獲取完畢后需要清除滾動,否則影響下次查詢
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(scrollId);
ClearScrollResponse clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
//清除滾動是否成功
boolean isSuccess = clearScrollResponse.isSucceeded();
logger.info("=====================>清楚滾動scroll是否成功:{}",isSuccess);
}
四、總結(jié)
- 滾動查詢是建立在普通查詢基礎(chǔ)上的。
- 滾動查詢相當(dāng)于快照,如果在使用scroll進(jìn)行滾動查詢期間有增刪改的操作,那么查詢結(jié)果是獲取不到最新的數(shù)據(jù)的。
- 深度分頁和滾動查詢優(yōu)先使用滾動查詢,性能更優(yōu),CPU資源耗費更少。
- 使用完滾動查詢后要記得
清除滾動
,以免影響下次使用。
到了這里,關(guān)于ElasticSearch6.x版本的Scroll滾動查詢講解及Kibana和SpringBoot實操演示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!