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该有的速度了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?