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