Elasticsearch RangeQuery薪资上下限查询异常问题求助
问题原因分析
当前查询逻辑为salaryBottom >= 12且salaryTop <= 13,但ID=578的数据中salaryTop=-1,由于-1小于13,满足salaryTop <=13的条件,同时salaryBottom=33>=12,因此被错误返回。而该职位实际薪资范围是33到无上限,完全不符合12-13的区间要求。
解决方案
方案1:筛选薪资范围完全包含在12-13内的职位
适用于仅保留薪资下限≥12且上限≤13的职位,同时排除salaryTop=-1的无上限情况:
{ "from": 0, "size": 20, "query": { "bool": { "must": [ { "term": { "companyId": 3211002 } }, { "terms": { "status": ["0"] } }, { "range": { "salaryBottom": { "gte": 12 } } }, { "bool": { "must": [ { "range": { "salaryTop": { "lte": 13 } } }, { "bool": { "must_not": { "term": { "salaryTop": -1 } } } } ] } } ] } }, "sort": [ { "createTime": { "order": "desc" } } ] }
方案2:筛选薪资范围与12-13有交集的职位
适用于保留薪资下限≤13且上限≥12的职位(包含部分覆盖12-13区间的情况),同时将salaryTop=-1视为无上限,默认满足上限≥12的条件:
{ "from": 0, "size": 20, "query": { "bool": { "must": [ { "term": { "companyId": 3211002 } }, { "terms": { "status": ["0"] } }, { "range": { "salaryBottom": { "lte": 13 } } }, { "bool": { "should": [ { "range": { "salaryTop": { "gte": 12 } } }, { "term": { "salaryTop": -1 } } ], "minimum_should_match": 1 } } ] } }, "sort": [ { "createTime": { "order": "desc" } } ] }
注意事项
- 若
salaryBottom和salaryTop是数字类型,查询时直接使用数字(如12、13)而非字符串,避免类型转换导致的逻辑错误。 - 简化嵌套的
bool结构,去掉不必要的层级,提升查询可读性和性能。
内容的提问来源于stack exchange,提问作者ZhuXJun
相关产品推荐
相关产品推荐

