中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

elasticsearch的ScanScroll如何使用

發布時間:2021-12-16 10:11:15 來源:億速云 閱讀:242 作者:iii 欄目:云計算

這篇文章主要講解了“elasticsearch的ScanScroll如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“elasticsearch的ScanScroll如何使用”吧!

ScanScroll 的特點

  1. 優點

    1. 速度快

    2. 大數據量

  2. 缺點

    1. 不支持排序

    2. 不支持分頁

    3. 不支持評分

    4. 不支持續查


使用場景

        看起來,缺點要比優點多很多,不過它很有用。如果說BULK是為了快速入庫存在的,那SCAN就是為了快速出庫而誕生的。ES的查詢性能優越,但是分析能力弱。所以會有,比如把ES的數據拉到Hadoop集群去分析計算的需求,當然這個已經有現成的插件了,不出所料也是用的SCAN。如果SCAN遭遇BULK, 也就是ES到ES的話,它有另一個更熟悉的名字叫 復制表。

使用方法

def scanTest():
    searchRes = es.search(index="users",size=10,body={"query": {"match_all": {}}},search_type="scan",scroll="10s")
    while True:
        scrollRes=es.scroll(scroll_id=searchRes["_scroll_id"],scroll="10s",ignore=[400, 404])
        res_list = scrollRes["hits"]["hits"]
        if not len(res_list):
            break;
        for res in res_list:
            print res["_source"]["userName"]

原理流程

        整個流程比較清晰,先count一個總數,下面每次scroll,返回size*分片數的數據,直到遍歷全部。SCAN是支持查詢偏好preference的,可以指定分片,所以有人說的size*主分片數,是不準確的,這個很容易驗證。

  • 第一階段:Search

    • 用TotalHitCountCollector統計下總數,并且確定(節點,查詢上下文ID),Base64編碼成ScrollId返回

  • 第二階段:SearchScroll

    • 根據ScrollId去每個節點,找到查詢上下文ID執行XFilteredQuery,收集結果,合并返回


        第一階段除了返回總數,還有一個很神秘的ScrollId,這個ScrollId長成這樣,很像Base64編碼過的。一定不是ID那么簡單,了解一番,果不其然 ,主要有3個部分組成type,context,attributes

      1. type 分別是queryThenFetch,queryAndFetch,scan,我們這里講的是scan

      2. attributes 只有一個元素,total_hits

      3. context 是個分片的元組,有2個元素,分片 = [節點ID,查詢上下文ID]

        ScrollId 是個很容易會暴露秘密的東西,我們會發現ScrollId 依賴的節點ID和查詢上下文ID都是變量,查詢上下文ID,每次請求都要遞增的。所以每次請求的ScrollId 都不一樣,導致了如果在我們的SCAN過程意外終止,我們可能需要重新來過。

        每次SCAN,處理Scroll跳到下一頁去,我們自己指定form是無效的。

//SearchService
private void processScroll(InternalScrollSearchRequest request, SearchContext context) {
        // process scroll
        context.from(context.from() + context.size());
        context.scroll(request.scroll());
        // ...
 }
//ScanContext
public TopDocs execute(SearchContext context) throws IOException {
        ScanCollector collector = new ScanCollector(readerStates, context.from(), context.size(), context.trackScores());
        Query query = new XFilteredQuery(context.query(), new ScanFilter(readerStates, collector));
        try {
            context.searcher().search(query, collector);
        } catch (ScanCollector.StopCollectingException e) {
            // all is well
        }
        return collector.topDocs();
}

        自定義的Filter,Collector,執行搜索,收集那一頁的結果集

 //ScanContext
 public void collect(int doc) throws IOException {
            if (counter >= from) {
                docs.add(new ScoreDoc(docBase + doc, trackScores ? scorer.score() : 0f));
            }
            readerState.count++;
            counter++;
            if (counter >= to) {
                throw StopCollectingException;
            }
}

        根據以往數據庫的認識,count操作總是很慢的,這讓我很擔心會延長整個查詢的時間,后來我發現這種擔心是多余的,對于全文檢索count操作是很快速的。根據測試,17億數據24個分片,平均每個分片的count時間在200ms到700ms之間,最糟糕的情況下總數也能在1秒內返回,這對于整個查詢時間而言是可以接受的。

感謝各位的閱讀,以上就是“elasticsearch的ScanScroll如何使用”的內容了,經過本文的學習后,相信大家對elasticsearch的ScanScroll如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汉寿县| 龙胜| 土默特左旗| 项城市| 甘洛县| 安塞县| 电白县| 务川| 中方县| 东宁县| 佛教| 高淳县| 衡山县| 宣威市| 巴彦县| 华安县| 永清县| 商城县| 临清市| 双桥区| 乐至县| 台南县| 中西区| 吉林市| 灵石县| 双江| 孟连| 冕宁县| 遂溪县| 驻马店市| 宝应县| 大厂| 京山县| 凤翔县| 临海市| 错那县| 丹阳市| 鲁山县| 封开县| 江达县| 高清|