今天突然之間發現一個訪問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該有的速度了。