国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java使用ElasticSearch的scroll查詢,高效的解決es查詢數(shù)量的限制。

這篇具有很好參考價值的文章主要介紹了java使用ElasticSearch的scroll查詢,高效的解決es查詢數(shù)量的限制。。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java使用ElasticSearch的scroll查詢,高效的解決es查詢數(shù)量的限制。

一、為什么要使用ES的scroll

(1)首先我們要明白es的查詢機制:ES的搜索是分2個階段進行的,即Query階段和Fetch階段。

  • Query階段比較輕量級,通過查詢倒排索引,獲取滿足查詢結(jié)果的文檔ID列表。

  • Fetch階段比較重,需要將每個分片的查詢結(jié)果取回,在協(xié)調(diào)結(jié)點進行全局排序。 通過From+size這種方式分批獲取數(shù)據(jù)的時候,隨著from加大,需要全局排序并丟棄的結(jié)果數(shù)量隨之上升,性能越來越差。

(2)es在進行普通的查詢時,默認只給查詢出來十條數(shù)據(jù)。

? 通過設置size的值可以使查詢結(jié)果從10增大到1000條數(shù)據(jù),當超出1000條數(shù)據(jù)的時候就會只顯示出來1000條數(shù)據(jù)。

? 為了解決上面的問題可以采用一種效率比較低的方法,在創(chuàng)建索引的時候添加如下配置

  • 
    "settings":{
    		"index":{
    			"max_result_window": 在這里填入你需要的大小				}
    			}
    

(3)如果進行高效的查詢呢?那就需要使scroll滾動查詢了。

? Scroll查詢,先做輕量級的Query階段以后,免去了繁重的全局排序過程。 它只是將查詢結(jié)果集,也就是doc_id列表保留在一個上下文里, 之后每次分批取回的時候,只需根據(jù)設置的size,在每個分片內(nèi)部按照一定順序(默認doc_id續(xù)), 取回size數(shù)量大小的數(shù)據(jù)即可。

二、如何使用scroll

(1)首先引入elasticsearch的坐標

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>

(2)編寫如下代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-436834.html


    /**
     * 使用es的scroll方法來滾動查詢es的數(shù)據(jù),可以有效的解決大數(shù)據(jù)容量讀取的限制
     * @param index  es的索引名稱
     * @param host   es的主機ip號
     * @param port   es的端口號
     * @param beginDate   構造查詢條件需要的條件之一 (可以根據(jù)自己需求定義es的查詢條件)
     * @param endDate     構造查詢條件需要的條件之一 (可以根據(jù)自己需求定義es的查詢條件)
     */
    public void scrollDemo(String index,String host,int port,String beginDate,String  endDate) throws ParseException {
        RestHighLevelClient restHighLevelClient=new RestHighLevelClient(RestClient.builder(new HttpHost(host,port,"http")));
        //構造查詢條件
        SearchRequest searchRequest = new SearchRequest(index);
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //設置查詢超時時間
        Scroll scroll = new Scroll(TimeValue.timeValueMinutes(5L));
        builder.query(QueryBuilders.rangeQuery("datetime").gte(beginDate).lte(endDate));
        //設置最多一次能夠取出1000筆數(shù)據(jù),從第1001筆數(shù)據(jù)開始,將開啟滾動查詢  
        //PS:滾動查詢也屬于這一次查詢,只不過因為一次查不完,分多次查
        builder.size(1000);
        searchRequest.source(builder);
        //將滾動放入
        searchRequest.scroll(scroll);
        SearchResponse searchResponse = null;
        try {
            searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            System.out.println("查詢索引庫失敗");
        }
        SearchHits hits= searchResponse.getHits();
        SearchHit[] hit= hits.getHits();
        /**
        *在這個位置已經(jīng)讀到了前一千條數(shù)據(jù),可以在這先對這一千數(shù)據(jù)進行處理。下面滾動查詢剩下的數(shù)據(jù)
        */
        //記錄要滾動的ID
        String scrollId = searchResponse.getScrollId();
        //滾動查詢部分,將從第1001筆數(shù)據(jù)開始取
        SearchHit[] hitsScroll = hits.getHits();
        while (hitsScroll != null && hitsScroll.length > 0 ) {
            //構造滾動查詢條件
            SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
            searchScrollRequest.scroll(scroll);
            try {
                //響應必須是上面的響應對象,需要對上一層進行覆蓋
                searchResponse = restHighLevelClient.scroll(searchScrollRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                System.out.println("滾動查詢失敗");
            }
            scrollId = searchResponse.getScrollId();
            hits = searchResponse.getHits();
            hitsScroll = hits.getHits();
            /**
            *在這個位置可以對滾動查詢到的從1001條數(shù)據(jù)開始的數(shù)據(jù)進行處理。
            */
        }
        //清除滾動,否則影響下次查詢
        ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
        clearScrollRequest.addScrollId(scrollId);
        ClearScrollResponse clearScrollResponse = null;
        try {
            clearScrollResponse = restHighLevelClient.clearScroll(clearScrollRequest,RequestOptions.DEFAULT);
        } catch (IOException e) {
            System.out.println("滾動查詢刪除失敗");
        }
        //清除滾動是否成功
        boolean succeeded = clearScrollResponse.isSucceeded();
    }

到了這里,關于java使用ElasticSearch的scroll查詢,高效的解決es查詢數(shù)量的限制。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • ES es Elasticsearch 十三 Java api 實現(xiàn)搜索 分頁查詢 復雜查詢 過濾查詢 ids查詢 等

    目錄 Java api 實現(xiàn)搜索 Pom.xml 建立鏈接 搜索全部記錄 增加規(guī)則值查某些字段 搜索分頁 全代碼 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 復雜查詢 bool查詢 filter? bool 復雜查詢增加過濾器查詢 復雜擦好像加排序 日志 思路 參考 api 寫法 寫Java代碼 請求條件構建層次

    2024年02月04日
    瀏覽(25)
  • ElasticSearch進階:多種查詢操作,各種ES查詢以及在Java中的實現(xiàn)

    ElasticSearch進階:多種查詢操作,各種ES查詢以及在Java中的實現(xiàn)

    目錄 前言 1 詞條查詢 1.1 等值查詢-term 1.2 多值查詢-terms 1.3 范圍查詢-range 1.4 前綴查詢-prefix 1.5 通配符查詢-wildcard 2 復合查詢 2.1 布爾查詢 2.2 Filter查詢 3 聚合查詢 3.1 最值、平均值、求和 3.2 去重查詢 3.3 分組聚合 3.3.1 單條件分組 3.3.2 多條件分組 3.4 過濾聚合 ElasticSearch 第一篇

    2024年02月02日
    瀏覽(26)
  • 關于SpringBoot集成ES Scroll API(滾動查詢)的實踐

    關于SpringBoot集成ES Scroll API(滾動查詢)的實踐

    那是年初在某個交付項目,從用戶側(cè)獲知了一個elastic search作為分布式數(shù)據(jù)庫的一個瓶頸,那就是單次查詢量超過了ES的默認單次查詢上限10000。 在大部分業(yè)務下,為了執(zhí)行ES的數(shù)據(jù)查詢,開發(fā)者往往都直接使用了query某個條件獲取數(shù)據(jù),這些條件對應的數(shù)據(jù)大多都不會超過1

    2024年01月23日
    瀏覽(17)
  • elasticSearch大量數(shù)據(jù)查詢導出報錯解決es

    elasticsearch的client包下的HeapBufferedAsyncResponseConsumer類中傳入了bufferLimit,該值 org.apache.http.nio.protocol.HttpAsyncResponseConsumer 的默認實現(xiàn)。在堆內(nèi)存中緩沖整個響應內(nèi)容,這意味著緩沖區(qū)的大小等于響應的內(nèi)容長度。根據(jù)可配置的參數(shù)限制可以讀取的響應的大小。如果實體長于配置

    2023年04月16日
    瀏覽(22)
  • Elasticsearch Search Scroll API(滾動查詢)

    Elasticsearch Search Scroll API(滾動查詢)

    參考:Elasticsearch Search Scroll API(滾動查詢) - 簡書 Elasticsearch 中,傳統(tǒng)的分頁查詢使用 from+size 的模式, from 就是頁碼,從 0 開始。默認情況下,當 (from+1)*size 大于 10000 時,也就是已查詢的總數(shù)據(jù)量大于 10000 時,會出現(xiàn)異常。 如下,用循環(huán)模擬一個連續(xù)分頁查詢: 最終當

    2023年04月20日
    瀏覽(17)
  • 【ElasticSearch】ES自動補全查詢與Java接口實現(xiàn)

    【ElasticSearch】ES自動補全查詢與Java接口實現(xiàn)

    自動補全就是當用戶在搜索框輸入字符時,我們應該提示出與該字符有關的搜索項。 要實現(xiàn)根據(jù)字母做補全,就必須對文檔按照拼音分詞。GitHub上有相關插件,地址:https://github.com/medcl/elasticsearch-analysis-pinyin,下載和ES對應的版本。 安裝步驟: 解壓 上傳到虛擬機中,elasti

    2024年02月15日
    瀏覽(20)
  • ElasticSearch 10000條查詢數(shù)量限制

    ElasticSearch 10000條查詢數(shù)量限制

    我們將庫存快照數(shù)據(jù)導入ES后發(fā)現(xiàn)要分頁查詢10000條以后的記錄會報錯,這是因為ES通過index.max_result_window這個參數(shù)控制能夠獲取數(shù)據(jù)總數(shù)from+size最大值,默認限制是10000條,因為ES考慮到數(shù)據(jù)要從其它節(jié)點上報到協(xié)調(diào)節(jié)點如果搜索請求的數(shù)據(jù)越多,會導致ES協(xié)調(diào)節(jié)點占用的堆內(nèi)

    2024年02月06日
    瀏覽(24)
  • Elasticsearch 查詢和聚合查詢:基本語法和統(tǒng)計數(shù)量

    摘要:Elasticsearch是一個強大的分布式搜索和分析引擎,提供了豐富的查詢和聚合功能。本文將介紹Elasticsearch的基本查詢語法,包括預發(fā)查詢和聚合查詢,以及如何使用聚合功能統(tǒng)計數(shù)量。 Elasticsearch是一種開源的分布式搜索和分析引擎,廣泛應用于各種場景,包括日志分析、

    2024年02月11日
    瀏覽(29)
  • ElasticSearch進階:一文全覽各種ES查詢在Java中的實現(xiàn)

    ElasticSearch進階:一文全覽各種ES查詢在Java中的實現(xiàn)

    ElasticSearch進階:一文全覽各種ES查詢在Java中的實現(xiàn) es基本語句詳解 查詢語句詳解 ElasticSearch第一篇: ElasticSearch基礎:從倒排索引說起,快速認知ES 完整項目已上傳至:ElasticSearch Demo 項目,該項目是關于springboot的集成項目,ElasticSearch部分請關注【elasticSearch-demo】模塊。覺得

    2024年02月02日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包