在 Elasticsearch(ES)中,“延迟”通常体现在 写入延迟、查询延迟、搜索慢、聚合慢 等方面。解决思路是:先定位瓶颈,再针对性优化。下面从 排查思路 + 常见原因 + 解决方案 系统说明。
不同延迟,优化方向完全不同:
| 延迟类型 | 表现 |
|---|---|
| 写入延迟 | 数据写入慢、bulk 超时 |
| 查询延迟 | search 慢、接口 RT 高 |
| 聚合延迟 | terms / date_histogram 慢 |
| 集群恢复延迟 | 节点重启、扩容慢 |
| 实时性延迟 | 写入后查不到 |
✅ 合理 bulk 大小
建议:5–15 MB / bulk
文档数:1000–5000 左右
✅ 调整 refresh_interval
PUT my_index/_settings
{
"index.refresh_interval": "30s"
}
默认 1s,实时性要求不高可加大
✅ 减少副本
PUT my_index/_settings
{
"index.number_of_replicas": 1
}
✅ 使用 SSD
机械盘是 ES 性能杀手
✅ 避免深分页 ❌ 不推荐:
from: 10000
size: 20
✅ 推荐:
search_after
✅ 使用 filter 替代 must
{
"query": {
"bool": {
"filter": [
{ "term": { "status": 1 } }
]
}
}
}
filter 不计算评分,可缓存
✅ 避免 * 查询
"query": { "wildcard": { "name": "*abc*" } } // ❌
✅ 开启慢查询日志
PUT _settings
{
"index.search.slowlog.threshold.query.warn": "1s"
}
✅ 高基数字段优化
PUT my_index/_mapping
{
"properties": {
"user_id": {
"type": "keyword",
"eager_global_ordinals": true
}
}
}
✅ 减少聚合层级
多层 nested + terms 非常慢
✅ 使用 sampler / composite
"composite"
✅ JVM 堆大小
≤ 50% 内存
≤ 30–32 GB(避免 compressed oops 失效)
✅ 控制分片数量
单节点:20–30 分片
单分片大小:10–50 GB
✅ 避免小索引
一个索引一个分片,几百个索引 = 灾难
✅ 手动 refresh(不推荐频繁)
POST my_index/_refresh
✅ 接受近实时(Near Real Time)
ES 本身不是强一致系统
✅ 磁盘 IO
✅ JVM GC
✅ 分片数
✅ bulk 大小
✅ refresh_interval
✅ 是否有慢查询
✅ 是否深分页
✅ 是否 nested 滥用
ES 延迟问题 80% 来自:分片设计不合理 + 查询写法差 + 刷新策略不当
如果你愿意,可以告诉我:
我可以 直接帮你给出针对性优化方案或配置示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。