概述ES 性能优化的核心在于映射设计、分片与查询策略。本文提供热门实践与验证方法,避免深分页与高基数聚合的常见陷阱。映射与字段类型(已验证)`keyword`:精确匹配与聚合;默认启用 `doc_values` 便于聚合与排序。`text` + `analyzer`:全文搜索;不用于聚合排序(除非开启 `fielddata`,不推荐)。数值与日期:选择合适类型,避免字符串比较造成排序异常。分片与副本分片数:根据数据规模与节点数估算;过多分片导致元数据与查询开销,过少影响并行度。副本数:≥1 保障可用性;高查询读压时可适度提高。深分页与排序避免 `from`/`size` 深分页(默认 `index.max_result_window=10000`)。使用 `search_after` 基于上一页排序值进行游标翻页。{ "search_after": ["last_sort_value"], "sort": [{"ts": "desc"}], "size": 100 } 聚合与基数使用 `keyword` 字段进行聚合;避免对高基数字段进行全局聚合。需要估算时使用 `cardinality` 聚合并设置合理 `precision_threshold`。索引生命周期(ILM)热温冷分层:热(写多读多)→ 温(读多)→ 冷(读少归档)。滚动策略:按时间或体积滚动,保持分片均衡与查询性能。示例映射(片段){ "mappings": { "properties": { "user": { "type": "keyword" }, "msg": { "type": "text", "analyzer": "standard" }, "ts": { "type": "date" } } } } 验证与监控查询耗时与 P95/P99;观察 `search_phase` 时间分布与慢查询日志。分片健康:`_cat/shards` 与 `cluster` 状态;热点分片重新分配。写入与刷新:控制 `refresh_interval`;批量写入提升吞吐。常见误区所有字段都用 `text`,导致聚合和排序性能差。分片数设置过大,造成资源浪费与慢查询。深分页依赖 `from`/`size`,导致严重性能退化。结语通过合理的映射、分片与分页策略,并以监控与日志验证,ES 能在大规模数据场景下保持良好查询与写入性能。

发表评论 取消回复