SpringBoot整合Elasticsearch游標(biāo)查詢的示例代碼(scroll)
游標(biāo)查詢(scroll)簡介
scroll
查詢 可以用來對(duì) Elasticsearch 有效地執(zhí)行大批量的文檔查詢,而又不用付出深度分頁那種代價(jià)。
游標(biāo)查詢會(huì)取某個(gè)時(shí)間點(diǎn)的快照數(shù)據(jù)。 查詢初始化之后索引上的任何變化會(huì)被它忽略。 它通過保存舊的數(shù)據(jù)文件來實(shí)現(xiàn)這個(gè)特性,結(jié)果就像保留初始化時(shí)的索引 視圖 一樣。
啟用游標(biāo)查詢可以通過在查詢的時(shí)候設(shè)置參數(shù) scroll
的值為我們期望的游標(biāo)查詢的過期時(shí)間。 游標(biāo)查詢的過期時(shí)間會(huì)在每次做查詢的時(shí)候刷新,所以這個(gè)時(shí)間只需要足夠處理當(dāng)前批的結(jié)果就可以了,而不是處理查詢結(jié)果的所有文檔的所需時(shí)間。 這個(gè)過期時(shí)間的參數(shù)很重要,因?yàn)楸3诌@個(gè)游標(biāo)查詢窗口需要消耗資源,所以我們期望如果不再需要維護(hù)這種資源就該早點(diǎn)兒釋放掉。 設(shè)置這個(gè)超時(shí)能夠讓 Elasticsearch 在稍后空閑的時(shí)候自動(dòng)釋放這部分資源。
GET /old_index/_search?scroll=1m { "query": { "match_all": {}}, "sort" : ["_doc"], "size": 1000 }
scroll=1m:保持游標(biāo)查詢窗口一分鐘。
返回結(jié)果示例:
{ "_scroll_id": "cXVlcnlUaGVuRmV0Y2g7NTsxMDk5NDpkUmpiR2FjOFNhNnlCM1ZDMWpWYnRROzEwOTk1OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MTA5OTM6ZFJqYkdhYzhTYTZ5QjNWQzFqVmJ0UTsxMTE5MDpBVUtwN2lxc1FLZV8yRGVjWlI2QUVBOzEwOTk2OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MDs=", "took": 10, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 2633253, "max_score": 1.0, "hits": [ { "_index": "old_index", "_type": "old_index_type", "_id": "1", "_score": 1.0, "_source": { ... } } ] } }
這個(gè)查詢的返回結(jié)果包括一個(gè)字段 _scroll_id
, 它是一個(gè)base64編碼的長字符串 。 現(xiàn)在我們能傳遞字段 _scroll_id
到 _search/scroll
查詢接口獲取下一批結(jié)果:
GET /_search/scroll { "scroll": "1m", "scroll_id" : "cXVlcnlUaGVuRmV0Y2g7NTsxMDk5NDpkUmpiR2FjOFNhNnlCM1ZDMWpWYnRROzEwOTk1OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MTA5OTM6ZFJqYkdhYzhTYTZ5QjNWQzFqVmJ0UTsxMTE5MDpBVUtwN2lxc1FLZV8yRGVjWlI2QUVBOzEwOTk2OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MDs=" }
注意:需要再次設(shè)置游標(biāo)查詢過期時(shí)間為一分鐘。
這個(gè)游標(biāo)查詢返回下一批結(jié)果。
另外盡管我們指定字段 size
的值為1000
,但是我們有可能取到超過這個(gè)值數(shù)量的文檔。 當(dāng)查詢的時(shí)候, 字段 size
作用于單個(gè)分片,所以每個(gè)批次實(shí)際返回的文檔數(shù)量最大為 size * number_of_primary_shards
。
注意:游標(biāo)查詢每次返回一個(gè)新字段 _scroll_id
。每次我們做下一次游標(biāo)查詢, 我們必須把前一次查詢返回的字段_scroll_id
傳遞進(jìn)去。 當(dāng)沒有更多的結(jié)果返回的時(shí)候,我們就處理完所有匹配的文檔了。
整合
新增以下三個(gè)方法:
/** * 游標(biāo)查詢 * @param params 查詢?nèi)雲(yún)? * @param indexName 索引名稱 * @param type 索引類型 * @param defaultSort 默認(rèn)排序 * @param keyMappings 字段映射 * @param keyMappingsMap 索引對(duì)應(yīng)字段映射 * @param scrollTimeInMillis 游標(biāo)開啟的時(shí)間 * @return Page */ protected Page<Map> commonStartScroll(Map<String, String> params, String indexName, String type, String defaultSort, Map<Key, FieldDefinition> keyMappings, Map<String, Map<Key, FieldDefinition>> keyMappingsMap, long scrollTimeInMillis) { SearchQuery searchQuery = buildSearchQuery(params, indexName, type, defaultSort, keyMappings, keyMappingsMap); return elasticsearchTemplate.startScroll(scrollTimeInMillis, searchQuery, Map.class); } /** * 游標(biāo)查詢 * @param scrollId 游標(biāo)ID * @param scrollTimeInMillis 游標(biāo)開啟的時(shí)間 * @return Page */ protected Page<Map> commonContinueScroll(String scrollId, long scrollTimeInMillis) { return elasticsearchTemplate.continueScroll(scrollId, scrollTimeInMillis, Map.class); } /** * 根據(jù)游標(biāo)ID清除游標(biāo)(提早釋放資源,降低ES的負(fù)擔(dān)) * @param scrollId 游標(biāo)ID */ protected void clearScroll(String scrollId) { elasticsearchTemplate.clearScroll(scrollId); }
StoreSearchService
中增加游標(biāo)查詢方法以及清除游標(biāo)方法:
/** * 游標(biāo)查詢 * @param params 查詢條件 * @return page */ public Page<Map> scroll(Map<String, String> params) { IndexConfig config = indexEntity.getConfigByDocCode(DOC_CODE); // 如果請(qǐng)求參數(shù)包含游標(biāo)ID,則說明執(zhí)行翻頁操作,否則認(rèn)為開啟新的游標(biāo)查詢 String scrollId = params.getOrDefault(SCROLL_ID, null); if (StringUtils.isNotBlank(scrollId)) { return commonContinueScroll(params.get(scrollId), config.getScrollTimeInMillis()); } return commonStartScroll(params, config.getIndexName(), config.getType(), DEFAULT_SORT, keyMappings, keyMappingsMap, config.getScrollTimeInMillis()); } public void clearScroll(String scrollId) { super.clearScroll(scrollId); }
對(duì)外暴露接口:
@PostMapping("/scroll") public ResponseResult scroll(@RequestBody Map<String, String> params) { return ResponseResult.success(storeSearchService.scroll(params)); } @GetMapping("/scroll/clear/{scrollId}") public ResponseResult clearScroll(@PathVariable String scrollId) { storeSearchService.clearScroll(scrollId); return ResponseResult.success(null); }
游標(biāo)查詢分為開啟和繼續(xù)兩個(gè)步驟,接口/scroll
中根據(jù)_scrollId
判斷為開啟游標(biāo)查詢還是繼續(xù)游標(biāo)查詢。
若條件允許的話,盡量將游標(biāo)查詢及時(shí)關(guān)閉,以釋放ES集群的資源,降低負(fù)擔(dān)。
源碼
Git項(xiàng)目地址:https://github.com/lifengdi/search
原文鏈接:https://www.lifengdi.com/archives/article/2119
到此這篇關(guān)于SpringBoot整合Elasticsearch游標(biāo)查詢(scroll)的文章就介紹到這了,更多相關(guān)SpringBoot整合Elasticsearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決SpringBoot整合ElasticSearch遇到的連接問題
- es(elasticsearch)整合SpringCloud(SpringBoot)搭建教程詳解
- SpringBoot整合Spring Data Elasticsearch的過程詳解
- SpringBoot整合Elasticsearch7.2.0的實(shí)現(xiàn)方法
- SpringBoot整合Elasticsearch并實(shí)現(xiàn)CRUD操作
- 解決springboot無法注入JpaRepository的問題
- SpringBoot3整合 Elasticsearch 8.x 使用Repository構(gòu)建增刪改查示例應(yīng)用
相關(guān)文章
java中LinkedList使用迭代器優(yōu)化移除批量元素原理
本文主要介紹了java中LinkedList使用迭代器優(yōu)化移除批量元素原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10java 字符串詞頻統(tǒng)計(jì)實(shí)例代碼
java 字符串詞頻統(tǒng)計(jì)實(shí)例代碼,需要的朋友可以參考一下2013-03-03SpringCloud:feign對(duì)象傳參和普通傳參及遇到的坑解決
這篇文章主要介紹了SpringCloud:feign對(duì)象傳參和普通傳參及遇到的坑解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03JavaWeb表單注冊(cè)界面的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaWeb表單注冊(cè)界面的實(shí)現(xiàn)方法的相關(guān)資料,希望通過本文大家能掌握這部分內(nèi)容,需要的朋友可以參考下2017-09-09PowerJob的ServerDiscoveryService工作流程源碼解讀
這篇文章主要為大家介紹了PowerJob的ServerDiscoveryService工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Spring依賴注入多種類型數(shù)據(jù)的示例代碼
這篇文章主要介紹了Spring依賴注入多種類型數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03