合理的索引设计与字段映射是查询性能的基础。优先选择keyword类型处理需要精确匹配、排序或聚合的字段(如status、category_id),避免使用text类型(text会进行分词分析,增加计算开销);禁用未使用的字段(如不需要检索的字段设置"index": false,不需要存储的字段设置"_source": false),减少索引体积;控制分片大小(理想范围20-50GB),避免分片过多(小分片会增加跨分片合并开销)或过少(大分片会增加单个分片的查询压力)。
score),且结果可被缓存(默认开启),性能比查询高2-3倍。例如,过滤status: active的条件应使用bool查询的filter子句:{
"query": {
"bool": {
"filter": [{"term": {"status": "active"}}]
}
}
}
from+size分页在from较大时(如from=1000),会导致ES加载并丢弃大量无用数据,性能骤降。推荐使用search_after(基于上一页最后一条记录的排序值获取下一页)或scroll API(适用于大批量数据导出)。must/should嵌套),将复杂查询拆分为多个简单查询;使用精确匹配代替全文搜索(如term查询代替match查询),减少不必要的分词和分析过程。_source参数指定需要返回的字段(如"_source": ["title", "price"]),避免返回所有字段,减少网络传输和内存占用。term、range查询),可通过indices.queries.cache.size调整缓存大小(如设置为堆内存的20%:"20%"),提升高频过滤条件的缓存命中率。constant_score包装过滤器:对于不需要评分的过滤条件,用constant_score包裹(如{"constant_score": {"filter": {"term": {"status": 1}}}}),强制走缓存,避免重复计算。indices.requests.cache.enable开启(默认开启),提升重复查询性能。{"aggs": {"filtered_data": {"filter": {"range": {"price": {"gte": 100}}}, "aggs": {"avg_price": {"avg": {"field": "price"}}}}}}),减少参与聚合的文档数。terms聚合:设置合理的size参数(如"size": 10,限制返回的桶数)和shard_size参数(如"shard_size": 100,提升分片级聚合的准确性);避免深度嵌套聚合(如terms+range多层嵌套),减少计算开销。user_id),使用cardinality聚合(近似去重)代替terms聚合(精确去重),降低计算复杂度。execution_hint:对于数值型range聚合,设置"execution_hint": "map"(内存哈希计算),替代默认的global_ordinals(基于全局序数),提升聚合性能。-XX:+UseG1GC),减少GC对查询的影响。thread_pool.search.size设置为CPU核心数的1.5-2倍),增加并发查询能力;设置合理的队列大小(如thread_pool.search.queue_size设置为1000),避免请求堆积。index.search.slowlog.threshold.query.warn(警告阈值,如1s)、index.search.slowlog.threshold.query.info(记录阈值,如500ms)等参数开启慢查询日志,定位性能瓶颈(如慢查询的索引、查询条件)。/_nodes/hot_threads API查看集群中最繁忙的线程,定位CPU占用高的查询或操作(如某个聚合查询占用了大量CPU资源)。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。