索引设计是查询性能的基础,需结合业务场景精准配置Mapping和Settings:
category、price、user_id)务必映射为keyword类型;仅用于全文搜索的字段(如product_name、description)使用text类型,并通过fields子句添加.keyword子字段(如"product_name": {"type": "text", "fields": {"keyword": {"type": "keyword"}}}),兼顾全文检索与精确查询需求。_all字段(旧版ES默认开启,会消耗额外存储和计算资源),仅索引需要检索的字段(通过"index": false禁用无关字段)。查询语句的写法直接影响资源消耗,需遵循以下原则:
filter子句不计算_score(相关性评分),结果可被bitset缓存(重复查询直接读取缓存,性能提升数倍);而must子句需要计算评分,适合需要相关性排序的场景。例如,过滤status=published且price>=100的文档时,应使用bool+filter组合:{
"query": {
"bool": {
"filter": [
{"term": {"status": "published"}},
{"range": {"price": {"gte": 100}}}
]
}
}
}
text类型字段需用match查询(触发分词和倒排索引);keyword/number/boolean类型字段用term查询(精确匹配,避免分词开销)。例如,查询category="electronics"应使用term而非match。wildcard(通配符,如*phone)、regexp(正则表达式)查询(无法利用倒排索引,全扫描导致性能极差);限制fuzzy(模糊搜索)的fuzziness参数(建议设为1,避免AUTO导致的过高编辑距离计算);对自动补全需求,使用completion suggester(专门优化前缀搜索,性能远高于wildcard)。分页和聚合是查询性能的“重灾区”,需针对性解决:
from+size深分页(如from=10000&size=20),此时ES需要收集所有前10000条结果再截取,消耗大量内存和CPU。替代方案:
_sort值获取下一页(适合深度分页,无性能瓶颈);keyword类型(text类型需开启fielddata,消耗大量堆内存,易导致OOM);size参数控制聚合桶的数量(如terms聚合的size: 10,避免size: 10000导致内存溢出);composite聚合(支持after参数,分批拉取结果,避免一次性加载所有桶):{
"aggs": {
"my_buckets": {
"composite": {
"sources": [
{"brand": {"terms": {"field": "brand.keyword"}}},
{"category": {"terms": {"field": "category.keyword"}}}
],
"size": 10
}
}
}
}
合理利用缓存可显著提升查询性能:
filter子句的结果会被自动缓存(bitset格式),高频查询尽量使用filter(如status=published、create_time>2023-01-01等确定性条件),避免在filter中使用脚本或动态值(如range: {"timestamp": {"gte": "now-1h"}},动态值无法缓存)。request_cache(默认关闭),适合聚合类查询(如terms、avg),相同的查询可直接读取缓存(需设置"size": 0,避免返回大量数据)。search_thread_pool.size,适应高并发查询)。持续监控是优化的前提,需建立常态化机制:
index.search.slowlog.threshold.query.warn: 5s、index.search.slowlog.threshold.fetch.warn: 1s),记录超过阈值的查询(日志示例:[WARN ][index.search.slowlog.query] took[8.2s] reason[...]]),定位慢查询原因(如全表扫描、复杂脚本)。profile参数分析查询性能(GET /_search {"profile": true, "query": {...}}),查看每个查询子句的执行时间(如term、range、aggs),精准定位瓶颈(如某wildcard查询消耗了80%的时间)。bool+filter组合过滤(status=published、price>=100),使用term查询精确匹配category,开启request_cache提升聚合性能(如销量统计),将95分位延迟从2.3s降至450ms。completion suggester实现实时搜索建议(如输入“ip”返回“iPhone 15 Pro Max”),通过IK分词器(ik_smart/ik_max_word)优化中文分词(召回率提升15%),调整refresh_interval为30s(减少索引刷新次数,提升写入性能)。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。