如何优化该Elasticsearch查询以提升性能(含特定结果优先级需求)
Elasticsearch 查询性能优化方案
一、简化查询条件,消除冗余与低效写法
原查询的query_string存在重复逻辑,且txtbenefitid的条件写法不规范,可通过以下方式优化:
- 合并多字段的重复查询逻辑,用
multi_match替代零散的OR条件 - 用
exists查询替代低效的txtbenefitid:*通配符,用must_not exists替代错误的txtbenefitid:NULL(ES中NULL是字符串值,不是字段不存在的语义)
优化后的查询条件部分:
{ "from": 0, "size": 50, "query": { "bool": { "must": [ { "multi_match": { "query": "leave leave*", "fields": ["txtdisplayname", "txtsearchkeyword"] } } ], "should": [ { "exists": { "field": "txtbenefitid" } }, { "bool": { "must_not": { "exists": { "field": "txtbenefitid" } } } } ], "minimum_should_match": 1 } } }
二、替换脚本排序,降低计算开销
原排序依赖运行时脚本计算权重,性能损耗明显。可将权重逻辑迁移到function_score查询中,提前给目标文档赋予固定权重,直接用_score排序即可:
{ "from": 0, "size": 50, "query": { "function_score": { "query": { "bool": { "must": [ { "multi_match": { "query": "leave leave*", "fields": ["txtdisplayname", "txtsearchkeyword"] } } ], "should": [ { "exists": { "field": "txtbenefitid" } }, { "bool": { "must_not": { "exists": { "field": "txtbenefitid" } } } } ], "minimum_should_match": 1 } }, "functions": [ { "filter": { "term": { "txtdisplayname.keyword": "Manage Leave" } }, "weight": 50 }, { "filter": { "term": { "txtdisplayname.keyword": "Holiday Calendar" } }, "weight": 25 }, { "filter": { "term": { "txtdisplayname.keyword": "Onsite Leave" } }, "weight": 16.67 } ], "boost_mode": "multiply" } }, "sort": [ { "_score": { "order": "desc" } } ] }
注:权重值对应原脚本的计算逻辑(50/(index+1)),boost_mode: multiply保证原查询分数与权重相乘,和原脚本效果一致。
三、优化通配符查询性能
原查询中的leave*后缀通配符会增加查询开销,可通过以下方式优化:
- 给
txtdisplayname和txtsearchkeyword字段配置ngram分词器,提前将类似leave、leaves的词拆分为可匹配的词条,避免通配符查询 - 若必须保留通配符,确保使用的是
keyword子字段(如txtdisplayname.keyword),ES对keyword类型的后缀通配符支持相对更好
四、其他通用优化建议
- 确保
txtdisplayname.keyword、txtsearchkeyword.keyword、txtbenefitid字段都已创建索引,避免全表扫描 - 若查询逻辑固定,可利用ES的查询缓存(默认开启),减少重复计算
- 按需调整
size参数,若业务不需要50条结果,设置更小的值以降低数据传输和处理成本
内容的提问来源于stack exchange,提问作者lakshmipavan Ganga
相关产品推荐
相关产品推荐

