es 排序很慢的原因


今天突然之間發現一個訪問es的查詢很慢。由剛上線之前測試的100ms直接到了5s左右。瞬間懵逼。

這個用戶索引大概200w的數據。

查詢語句如下

GET /user/_search
{"from":0,"query":{
"bool":{"must_not":[{"term":{"_id":"5faf30e6fe3c39a30de907c3"}}]
}
},"size":30,"sort":[
{"clips_rec_state":{"order":"desc","unmapped_type":"long"}},
{"_geo_distance":{"distance_type":"plane","geo_point":[0,0],"order":"asc"}}
]}.

通過一步一步的分析發現 {"clips_rec_state":{"order":"desc","unmapped_type":"long"}} 這個排序語句導致了速度非常慢。

為啥這個排序語句很慢了?

網上查找了很多資料也沒有具體的解決辦法,然后只能通過自己的猜想和嘗試才發現了es這個坑。

我們公司用的mongodb 加 go. go 語言默認有零值。我們一般不會將零值插入到數據庫中,也就是clips_rec_state這個字段為0

的時候,mongodb是沒有這個字段。然后我們從mongodb同步到es的時候這個字段的值也是沒有的,除非設置了非零值。

其實就是因為這個字段沒有默認值導致的。既然找到了源頭,解決就有很多辦法了。

我直接將這個字段的零值也存在了數據庫中,然后es也就有了。

然后再將以前的舊數據同步一下。使用es這個請求:

POST user/_update_by_query?conflicts=proceed

{

    "script":{

        "lang":"painless",

        "source":"if (ctx._source.clips_rec_state == null) {ctx._source.clips_rec_state= 0}"

    }

}

將以前沒有這個字段的數據增加這個字段並復制為0。然后訪問這個接口就發現恢復了es該有的速度了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM