最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Elasticsearch游標(biāo)查詢(xún)的示例代碼(scroll)

 更新時(shí)間:2020年10月16日 16:48:28   作者:李鋒鏑的園子  
這篇文章主要介紹了SpringBoot整合Elasticsearch游標(biāo)查詢(xún)(scroll),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

游標(biāo)查詢(xún)(scroll)簡(jiǎn)介

scroll 查詢(xún) 可以用來(lái)對(duì) Elasticsearch 有效地執(zhí)行大批量的文檔查詢(xún),而又不用付出深度分頁(yè)那種代價(jià)。

游標(biāo)查詢(xún)會(huì)取某個(gè)時(shí)間點(diǎn)的快照數(shù)據(jù)。 查詢(xún)初始化之后索引上的任何變化會(huì)被它忽略。 它通過(guò)保存舊的數(shù)據(jù)文件來(lái)實(shí)現(xiàn)這個(gè)特性,結(jié)果就像保留初始化時(shí)的索引 視圖 一樣。

啟用游標(biāo)查詢(xún)可以通過(guò)在查詢(xún)的時(shí)候設(shè)置參數(shù) scroll 的值為我們期望的游標(biāo)查詢(xún)的過(guò)期時(shí)間。 游標(biāo)查詢(xún)的過(guò)期時(shí)間會(huì)在每次做查詢(xún)的時(shí)候刷新,所以這個(gè)時(shí)間只需要足夠處理當(dāng)前批的結(jié)果就可以了,而不是處理查詢(xún)結(jié)果的所有文檔的所需時(shí)間。 這個(gè)過(guò)期時(shí)間的參數(shù)很重要,因?yàn)楸3诌@個(gè)游標(biāo)查詢(xún)窗口需要消耗資源,所以我們期望如果不再需要維護(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)查詢(xún)窗口一分鐘。

返回結(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è)查詢(xún)的返回結(jié)果包括一個(gè)字段 _scroll_id, 它是一個(gè)base64編碼的長(zhǎng)字符串 。 現(xiàn)在我們能傳遞字段 _scroll_id_search/scroll 查詢(xún)接口獲取下一批結(jié)果:

GET /_search/scroll
{
  "scroll": "1m", 
  "scroll_id" : "cXVlcnlUaGVuRmV0Y2g7NTsxMDk5NDpkUmpiR2FjOFNhNnlCM1ZDMWpWYnRROzEwOTk1OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MTA5OTM6ZFJqYkdhYzhTYTZ5QjNWQzFqVmJ0UTsxMTE5MDpBVUtwN2lxc1FLZV8yRGVjWlI2QUVBOzEwOTk2OmRSamJHYWM4U2E2eUIzVkMxalZidFE7MDs="
}

注意:需要再次設(shè)置游標(biāo)查詢(xún)過(guò)期時(shí)間為一分鐘。

這個(gè)游標(biāo)查詢(xún)返回下一批結(jié)果。

另外盡管我們指定字段 size 的值為1000,但是我們有可能取到超過(guò)這個(gè)值數(shù)量的文檔。 當(dāng)查詢(xún)的時(shí)候, 字段 size 作用于單個(gè)分片,所以每個(gè)批次實(shí)際返回的文檔數(shù)量最大為 size * number_of_primary_shards。

注意:游標(biāo)查詢(xún)每次返回一個(gè)新字段 _scroll_id。每次我們做下一次游標(biāo)查詢(xún), 我們必須把前一次查詢(xún)返回的字段_scroll_id 傳遞進(jìn)去。 當(dāng)沒(méi)有更多的結(jié)果返回的時(shí)候,我們就處理完所有匹配的文檔了。

整合

新增以下三個(gè)方法:

/**
 * 游標(biāo)查詢(xún)
 * @param params 查詢(xún)?nèi)雲(yún)?
 * @param indexName 索引名稱(chēng)
 * @param type 索引類(lèi)型
 * @param defaultSort 默認(rèn)排序
 * @param keyMappings 字段映射
 * @param keyMappingsMap 索引對(duì)應(yīng)字段映射
 * @param scrollTimeInMillis 游標(biāo)開(kāi)啟的時(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)查詢(xún)
 * @param scrollId 游標(biāo)ID
 * @param scrollTimeInMillis 游標(biāo)開(kāi)啟的時(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)查詢(xún)方法以及清除游標(biāo)方法:

/**
 * 游標(biāo)查詢(xún)
 * @param params 查詢(xún)條件
 * @return page
 */
public Page<Map> scroll(Map<String, String> params) {
  IndexConfig config = indexEntity.getConfigByDocCode(DOC_CODE);

  // 如果請(qǐng)求參數(shù)包含游標(biāo)ID,則說(shuō)明執(zhí)行翻頁(yè)操作,否則認(rèn)為開(kāi)啟新的游標(biāo)查詢(xún)
  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ún)分為開(kāi)啟和繼續(xù)兩個(gè)步驟,接口/scroll中根據(jù)_scrollId判斷為開(kāi)啟游標(biāo)查詢(xún)還是繼續(xù)游標(biāo)查詢(xún)。

若條件允許的話(huà),盡量將游標(biāo)查詢(xún)及時(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)查詢(xún)(scroll)的文章就介紹到這了,更多相關(guān)SpringBoot整合Elasticsearch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Guava中這些Map技巧可以讓代碼量減少了50%

    Guava中這些Map技巧可以讓代碼量減少了50%

    guava提供了非常強(qiáng)大的操作,可以讓我們把java代碼寫(xiě)的很簡(jiǎn)潔,下面這篇文章主要給大家介紹了關(guān)于Guava中這些Map使用技巧可以讓代碼量減少了50%的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Java注解(annotation)簡(jiǎn)述

    Java注解(annotation)簡(jiǎn)述

    這篇文章主要介紹了使用java的注解(用在java類(lèi)的方法上的注解)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Java設(shè)計(jì)模式之代理模式與@Async異步注解失效的解決

    Java設(shè)計(jì)模式之代理模式與@Async異步注解失效的解決

    代理模式是Java常見(jiàn)的設(shè)計(jì)模式之一。所謂代理模式是指客戶(hù)端并不直接調(diào)用實(shí)際的對(duì)象,而是通過(guò)調(diào)用代理,來(lái)間接的調(diào)用實(shí)際的對(duì)象
    2022-07-07
  • java獲取IP歸屬地全網(wǎng)顯示開(kāi)源庫(kù)使用

    java獲取IP歸屬地全網(wǎng)顯示開(kāi)源庫(kù)使用

    這篇文章主要為大家介紹了java獲取IP歸屬地全網(wǎng)顯示的開(kāi)源庫(kù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • java中final修飾符的使用方法

    java中final修飾符的使用方法

    這篇文章主要為大家詳細(xì)介紹了java中final修飾符的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Jmeter壓力測(cè)試簡(jiǎn)單教程(包括服務(wù)器狀態(tài)監(jiān)控)

    Jmeter壓力測(cè)試簡(jiǎn)單教程(包括服務(wù)器狀態(tài)監(jiān)控)

    Jmeter是一個(gè)非常好用的壓力測(cè)試工具。Jmeter用來(lái)做輕量級(jí)的壓力測(cè)試,非常合適,本文詳細(xì)的介紹了Jmeter的使用,感性的可以了解一下
    2021-11-11
  • java設(shè)置session過(guò)期時(shí)間的實(shí)現(xiàn)方法

    java設(shè)置session過(guò)期時(shí)間的實(shí)現(xiàn)方法

    這篇文章主要介紹了java設(shè)置session過(guò)期時(shí)間的實(shí)現(xiàn)方法,以實(shí)例形式詳細(xì)講述了具體實(shí)現(xiàn)過(guò)程,非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • Java?Spring?Dubbo三種SPI機(jī)制的區(qū)別

    Java?Spring?Dubbo三種SPI機(jī)制的區(qū)別

    這篇文章主要介紹了Java?Spring?Dubbo三種SPI機(jī)制的區(qū)別,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-08-08
  • Jackson的用法實(shí)例分析

    Jackson的用法實(shí)例分析

    這篇文章主要介紹了Jackson的用法實(shí)例分析,用于處理Java的json格式數(shù)據(jù)非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • Java?中的?clone(?)?和?new哪個(gè)效率更高

    Java?中的?clone(?)?和?new哪個(gè)效率更高

    很多朋友不太清楚clone()和new那個(gè)更快?針對(duì)這個(gè)問(wèn)題我百度了好多資料,最終小編總結(jié)下關(guān)于Java?中的?clone(?)?和?new哪個(gè)效率更高的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2021-12-12

最新評(píng)論

汉沽区| 玉田县| 叙永县| 信丰县| 闽侯县| 淮北市| 呼伦贝尔市| 牡丹江市| 浦江县| 四平市| 灯塔市| 新泰市| 潜山县| 化隆| 广灵县| 甘肃省| 垫江县| 丹寨县| 黎平县| 师宗县| 甘泉县| 孟津县| 洛阳市| 清水河县| 西吉县| 齐河县| 莱芜市| 海原县| 福建省| 台北市| 定日县| 东港市| 会同县| 临夏县| 浦东新区| 浑源县| 泰宁县| 汉源县| 和田市| 灯塔市| 铜陵市|