如何分析Elasticsearch中奇怪的查詢命中數(shù)問題

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何分析Elasticsearch中奇怪的查詢命中數(shù)問題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),宣恩企業(yè)網(wǎng)站建設(shè),宣恩品牌網(wǎng)站建設(shè),網(wǎng)站定制,宣恩網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,宣恩網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

業(yè)務(wù)部門反饋,在某個月份的索引中,當(dāng)查詢條件不變,僅添加一個索引前綴到請求中后,搜索返回的命中數(shù)量反而降低,如下圖所示,從索引 skylay*_alarm-2020.02* 中查詢時(shí),命中結(jié)果總數(shù) total為49條

?

如何分析Elasticsearch中奇怪的查詢命中數(shù)問題

但是當(dāng)添加了一個索引前綴 skylar*_alarm-2020.01* ,從 skylay*_alarm-2020.02*,skylar*_alarm-2020.01* 兩組索引一起查詢時(shí),命中結(jié)果總數(shù)居然降低為15條了:

如何分析Elasticsearch中奇怪的查詢命中數(shù)問題

?

按照常規(guī)理解,添加一個索引到查詢條件中,命中結(jié)果集只可能更多,不應(yīng)該降低,仔細(xì)觀察返回結(jié)果,發(fā)現(xiàn) _shards 中的 skipped 非常多,這點(diǎn)很可疑,感覺多半與他有關(guān)。

分析

分析查詢問題,首先想到的就是 profile 一把,在請求體中添加 "profile": true, 可惜沒看到有價(jià)值的東西,然后 google 一把,看有沒有其他人遇到 skipped 問題,發(fā)現(xiàn)在社區(qū)中很多人問到 skipped相關(guān)問題,基本沒有人回復(fù),唯一有價(jià)值的答復(fù)如下:

Are shards skipped when a range query does not create hits

Yes, there is a pre-flight search phase called the can match search phase that removes all shards from a search request that a query can not match (e.g., if a range query does not overlap with the range of values for a shard). This feature exists since 5.6.

這段內(nèi)容大致是說從5.6版本開始,在真正的查詢開始之前根據(jù)某些條件跳過不會匹配到的分片,例如范圍查詢過程中,某些分片的值不在查詢區(qū)間。

除此之外再無更多內(nèi)容,只能從源碼層面繼續(xù)分析。函數(shù)AbstractSearchAsyncAction#buildSearchResponse 負(fù)責(zé)構(gòu)建查詢返回結(jié)果,skipped數(shù)量取決于這個類中的一個計(jì)數(shù)器,繼續(xù)向上翻,找到將分片標(biāo)記為 skip 的地方CanMatchPreFilterSearchPhase#getIterator:

private GroupShardsIterator<SearchShardIterator> getIterator(...) {
   for (SearchShardIterator iter : shardsIts) {
       if (possibleMatches.get(i++)) {
           iter.reset();
       } else {
           //標(biāo)記為 skip,查詢的時(shí)候不會去查
           iter.resetAndSkip();
       }
   }
   return shardsIts;
}

由于需要優(yōu)先解決線上問題,暫時(shí)先不分析分片被設(shè)置為 skip 都會有哪些條件,CanMatchPreFilterSearchPhase這個階段只有滿足一定條件時(shí)才會執(zhí)行,也就是說如果不走這個階段就不會去檢查分片要不要被 skip。檢查條件在 TransportSearchAction#shouldPreFilterSearchShards中實(shí)現(xiàn),在此不再貼代碼,總結(jié)起來常見條件包括下面幾個,滿足下列條件之一時(shí),不走 CanMatchPreFilterSearchPhase (暫且稱為“預(yù)過濾”)流程。

  • 查詢中帶有 Global Aggregation 

  • 查詢中帶有聚合,并且聚合中設(shè)置了:"min_doc_count": 0

  • 待查詢的分片數(shù)小于 128,由查詢參數(shù) pre_filter_shard_size指定。

  • 查詢中使用了 Suggester

解決

找到了可以跳過“預(yù)過濾”的條件,問題解決問題就比較簡單,有兩種方式不影響現(xiàn)有業(yè)務(wù):

  • 對于含有聚合請求的查詢,可以在聚合請求中添加 "min_doc_count": 0

  • 對于不含聚合請求的查詢,可以在請求中調(diào)整pre_filter_shard_size參數(shù),讓他大于待查詢的分片數(shù),

    例如:_search?pre_filter_shard_size=1000

當(dāng)然,也可以統(tǒng)一使用 pre_filter_shard_size 參數(shù)。到此問題解決了,skipped 分片消失:

如何分析Elasticsearch中奇怪的查詢命中數(shù)問題

在 ES 使用過程中需要看代碼才能解決問題的時(shí)候比較少,但是關(guān)于查詢過程中分片 skipped 的原理在官方文檔中沒有具體說明,甚至在手冊中沒有解釋這個字段的含義。這次業(yè)務(wù)方使用的 ES 版本為5.6.12,不確定新版本的 ES 是否也存在類似問題,未來抽時(shí)間在新版本上分析一下“預(yù)過濾”的原理。

上述就是小編為大家分享的如何分析Elasticsearch中奇怪的查詢命中數(shù)問題了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站名稱:如何分析Elasticsearch中奇怪的查詢命中數(shù)問題
網(wǎng)站地址:http://www.muchs.cn/article10/gcejgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、靜態(tài)網(wǎng)站、云服務(wù)器、網(wǎng)站收錄標(biāo)簽優(yōu)化、

廣告

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

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)