分片是Elasticsearch的并行处理单元,合理设置分片数是提升性能的关键。单索引分片大小建议控制在10GB~50GB之间(日志场景可放宽至100GB),分片过多会导致查询时需要合并多个分片的结果,增加CPU和内存开销;分片过少则无法充分利用集群节点的并发能力。例如,对于300GB的商品数据,若单分片设置为50GB,则分片数为6个,既能保证写入并发,又能避免查询时的分片合并压力。此外,写入阶段可将副本数设置为0(index.number_of_replicas: 0),待数据导入完成后再恢复副本(如设置为1),减少写入时的网络传输和同步开销。
Mapping决定了字段的存储方式和索引行为,错误的Mapping会导致资源浪费。关键原则:
category、price),务必映射为keyword类型(或text+keyword组合);product_name),禁用默认的text类型,避免不必要的分词;_all字段(旧版Elasticsearch),减少索引存储空间。"category": {
"type": "keyword" // 用于精确匹配和聚合
}
通过显式定义Mapping,可避免Elasticsearch自动推断字段类型导致的性能问题。
index.refresh_interval):默认1秒,缩短刷新间隔会提高实时性,但会增加段合并压力和写入延迟。对于日志、监控等实时性要求低的场景,可设置为30秒或更长(如index.refresh_interval: 30s);全量导入时,可临时关闭刷新(-1),导入完成后再恢复。index.translog.sync_interval设置为30秒(默认5秒),index.translog.flush_threshold_size设置为2GB(默认512MB),可降低刷盘频率,提高写入吞吐量。同时,将index.translog.durability设置为async(异步刷盘),进一步提升写入性能。term、range),不计算相关性评分(_score),结果可被Bitset缓存,性能远高于Query上下文。例如,过滤已发布状态的商品时,应使用Filter:"bool": {
"filter": [
{ "term": { "status": "published" } }
]
}
match),需要计算评分,适用于需要相关性排序的场景。通过bool组合Filter和Query,可兼顾性能与准确性。wildcard(如"title": "*es*")和regexp(如"title": "/elasticsearch.*/")无法利用倒排索引,会导致全扫描,性能极差。替代方案:使用prefix(前缀匹配)或ngram分词器(预处理数据,支持模糊搜索)。"script": { "source": "doc['price'].value > 100" }),CPU密集,尽量避免。若需复杂逻辑,可使用function_score替代。from+size深分页:当from超过10000时,性能会急剧下降(需要合并大量分片结果)。替代方案:
"sort": [
{ "timestamp": "desc" },
{ "_id": "asc" }
],
"search_after": ["2025-01-01T00:00:00Z", "last_id"]
"range": { "timestamp": { "gte": "now-1h" } }),否则无法缓存。可将时间范围固定为具体时间段(如"gte": "2025-01-01T10:00:00Z"),提升缓存效率。request_cache(默认关闭),适合重复的聚合请求(如“每日销量统计”)。在查询中添加"request_cache": true即可启用。-Xms16g -Xmx16g(堆内存16GB)。-XX:+UseG1GC),相比CMS垃圾回收器,G1GC能更好地处理大堆内存,减少FullGC次数,提高吞吐量。开启慢查询日志,记录执行时间超过阈值的查询,便于分析和优化。在elasticsearch.yml中配置:
index.search.slowlog.threshold.query.warn: 5s # 查询慢警告阈值
index.search.slowlog.threshold.fetch.warn: 3s # 获取慢警告阈值
index.search.slowlog.level: info # 日志级别
通过慢查询日志,可定位到具体的慢查询语句(如全表扫描、高开销查询),针对性优化。
使用profile API获取查询的详细执行时间,定位瓶颈(如某个子句耗时过长)。例如:
GET /products/_search
{
"profile": true,
"query": {
"bool": {
"must": [{ "match": { "title": "elasticsearch" } }],
"filter": [{ "range": { "price": { "gte": 100 } } }]
}
}
}
返回结果中,profiles字段会显示每个查询子句的执行时间(如query、fetch阶段的耗时),帮助优化查询结构。
使用Kibana、Prometheus+Grafana等工具监控集群状态,关注以下指标:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。