SQL转Elasticsearch查询:求符合条件的Salary平均值的正确DSL
SQL转Elasticsearch等价查询问题
原SQL查询
Select AVG(Salary)
FROM employee_table
WHERE Jobtitle = "Webmaster" and city = "dallas" or state = "california"
自行编写的无结果查询
{ "query": { "bool": { "must": { "match": { "Jobtitle": "Webmaster" } }, "should": [ { "term": { "state": "California" } }, { "term": { "city": "Dallas" } } ] } } }
环境与数据示例
索引名:salaries
字段:ID、Jobtitle、city、salary、state
数据示例:
{ "_id": "gyfnLoQBy_hOUOvqeY9L", "_index": "other", "_score": 3.7432575, "_source": { "ID": "16", "JobTitle": "Webmaster", "city": "Dallas", "salary": "89919.2314721147", "state": "California" } }
正确的等价Elasticsearch查询
首先明确SQL的逻辑优先级:AND优先级高于OR,原WHERE子句等价于 (Jobtitle = "Webmaster" AND city = "dallas") OR state = "california"。同时你需要计算平均薪资,必须使用聚合(aggs)模块,结合以下修正后的查询:
{ "size": 0, // 仅返回聚合结果,无需返回具体文档 "query": { "bool": { "should": [ { "bool": { "must": [ { "match": { "JobTitle": "Webmaster" } }, { "match": { "city": "dallas" } } ] } }, { "match": { "state": "california" } } ], "minimum_should_match": 1 // 满足should中的至少一个条件 } }, "aggs": { "average_salary": { "avg": { "field": "salary" } } } }
问题修正点
- 逻辑结构:用嵌套
bool查询实现(A AND B) OR C的SQL逻辑,而非之前的A AND (B OR C)。 - 聚合配置:添加
aggs模块计算平均薪资,设置size:0过滤无关文档。 - 字段匹配:数据示例中字段为
JobTitle(大写T),需与索引映射的实际字段名保持一致,否则无法匹配。 - 匹配方式:
match查询会自动处理大小写与分词,比term精确匹配更适合text类型字段;若字段为keyword类型,可改用term但需保证大小写完全一致。
内容的提问来源于stack exchange,提问作者Gabs__1111
相关产品推荐
相关产品推荐

