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该有的速度了。

 

posted on   biwentao  阅读(2167)  评论(0编辑  收藏  举报

编辑推荐:
· 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爆火,是硬核还是营销?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示