這期內(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è)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,宣恩網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
業(yè)務(wù)部門反饋,在某個月份的索引中,當(dāng)查詢條件不變,僅添加一個索引前綴到請求中后,搜索返回的命中數(shù)量反而降低,如下圖所示,從索引 skylay*_alarm-2020.02* 中查詢時,命中結(jié)果總數(shù) total為49條
?
但是當(dāng)添加了一個索引前綴 skylar*_alarm-2020.01* ,從 skylay*_alarm-2020.02*,skylar*_alarm-2020.01* 兩組索引一起查詢時,命中結(jié)果總數(shù)居然降低為15條了:
?
按照常規(guī)理解,添加一個索引到查詢條件中,命中結(jié)果集只可能更多,不應(yīng)該降低,仔細觀察返回結(jié)果,發(fā)現(xiàn) _shards 中的 skipped 非常多,這點很可疑,感覺多半與他有關(guān)。
分析查詢問題,首先想到的就是 profile 一把,在請求體中添加 "profile": true, 可惜沒看到有價值的東西,然后 google 一把,看有沒有其他人遇到 skipped 問題,發(fā)現(xiàn)在社區(qū)中很多人問到 skipped相關(guān)問題,基本沒有人回復(fù),唯一有價值的答復(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 負責(zé)構(gòu)建查詢返回結(jié)果,skipped數(shù)量取決于這個類中的一個計數(shù)器,繼續(xù)向上翻,找到將分片標記為 skip 的地方CanMatchPreFilterSearchPhase#getIterator:
private GroupShardsIterator<SearchShardIterator> getIterator(...) {
for (SearchShardIterator iter : shardsIts) {
if (possibleMatches.get(i++)) {
iter.reset();
} else {
//標記為 skip,查詢的時候不會去查
iter.resetAndSkip();
}
}
return shardsIts;
}
由于需要優(yōu)先解決線上問題,暫時先不分析分片被設(shè)置為 skip 都會有哪些條件,CanMatchPreFilterSearchPhase這個階段只有滿足一定條件時才會執(zhí)行,也就是說如果不走這個階段就不會去檢查分片要不要被 skip。檢查條件在 TransportSearchAction#shouldPreFilterSearchShards中實現(xiàn),在此不再貼代碼,總結(jié)起來常見條件包括下面幾個,滿足下列條件之一時,不走 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ù)問題了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站名稱:如何分析Elasticsearch中奇怪的查詢命中數(shù)問題
網(wǎng)站地址:http://jinyejixie.com/article10/gcejgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、靜態(tài)網(wǎng)站、云服務(wù)器、網(wǎng)站收錄、標簽優(yōu)化、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)