elasticsearch的ScanScroll如何使用

這篇文章主要講解了“elasticsearch的ScanScroll如何使用”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“elasticsearch的ScanScroll如何使用”吧!

雙峰網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,雙峰網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為雙峰數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的雙峰做網(wǎng)站的公司定做!

ScanScroll 的特點(diǎn)

  1. 優(yōu)點(diǎn)

    1. 速度快

    2. 大數(shù)據(jù)量

  2. 缺點(diǎn)

    1. 不支持排序

    2. 不支持分頁(yè)

    3. 不支持評(píng)分

    4. 不支持續(xù)查

使用場(chǎng)景

        看起來(lái),缺點(diǎn)要比優(yōu)點(diǎn)多很多,不過(guò)它很有用。如果說(shuō)BULK是為了快速入庫(kù)存在的,那SCAN就是為了快速出庫(kù)而誕生的。ES的查詢性能優(yōu)越,但是分析能力弱。所以會(huì)有,比如把ES的數(shù)據(jù)拉到Hadoop集群去分析計(jì)算的需求,當(dāng)然這個(gè)已經(jīng)有現(xiàn)成的插件了,不出所料也是用的SCAN。如果SCAN遭遇BULK, 也就是ES到ES的話,它有另一個(gè)更熟悉的名字叫 復(fù)制表。

使用方法

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"]

原理流程

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

  • 第一階段:Search

    • 用TotalHitCountCollector統(tǒng)計(jì)下總數(shù),并且確定(節(jié)點(diǎn),查詢上下文ID),Base64編碼成ScrollId返回

  • 第二階段:SearchScroll

    • 根據(jù)ScrollId去每個(gè)節(jié)點(diǎn),找到查詢上下文ID執(zhí)行XFilteredQuery,收集結(jié)果,合并返回

        第一階段除了返回總數(shù),還有一個(gè)很神秘的ScrollId,這個(gè)ScrollId長(zhǎng)成這樣,很像Base64編碼過(guò)的。一定不是ID那么簡(jiǎn)單,了解一番,果不其然 ,主要有3個(gè)部分組成type,context,attributes

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

      2. attributes 只有一個(gè)元素,total_hits

      3. context 是個(gè)分片的元組,有2個(gè)元素,分片 = [節(jié)點(diǎn)ID,查詢上下文ID]

        ScrollId 是個(gè)很容易會(huì)暴露秘密的東西,我們會(huì)發(fā)現(xiàn)ScrollId 依賴的節(jié)點(diǎn)ID和查詢上下文ID都是變量,查詢上下文ID,每次請(qǐng)求都要遞增的。所以每次請(qǐng)求的ScrollId 都不一樣,導(dǎo)致了如果在我們的SCAN過(guò)程意外終止,我們可能需要重新來(lái)過(guò)。

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

//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,執(zhí)行搜索,收集那一頁(yè)的結(jié)果集

 //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;
            }
}

        根據(jù)以往數(shù)據(jù)庫(kù)的認(rèn)識(shí),count操作總是很慢的,這讓我很擔(dān)心會(huì)延長(zhǎng)整個(gè)查詢的時(shí)間,后來(lái)我發(fā)現(xiàn)這種擔(dān)心是多余的,對(duì)于全文檢索count操作是很快速的。根據(jù)測(cè)試,17億數(shù)據(jù)24個(gè)分片,平均每個(gè)分片的count時(shí)間在200ms到700ms之間,最糟糕的情況下總數(shù)也能在1秒內(nèi)返回,這對(duì)于整個(gè)查詢時(shí)間而言是可以接受的。

感謝各位的閱讀,以上就是“elasticsearch的ScanScroll如何使用”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)elasticsearch的ScanScroll如何使用這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

當(dāng)前名稱:elasticsearch的ScanScroll如何使用
當(dāng)前鏈接:http://muchs.cn/article42/jsoghc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化域名注冊(cè)、手機(jī)網(wǎng)站建設(shè)小程序開(kāi)發(fā)、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司