在Elasticsearch中存储与查询带单位的数值范围遇阻求助
Elasticsearch嵌套对象查询问题排查与解决
问题场景
需要在Elasticsearch文档中存储多组带单位的数值范围,示例文档结构如下:
PUT nested_index/_doc/1 { "operating_temperature": [ { "unit": "kelvin", "value": [ { "gte": 300, "lte": 500 } ] }, { "unit": "celcius", "value": [ { "gte": 0, "lte": 30 }, { "gte": 70, "lte": 200 } ] } ] } PUT nested_index/_doc/2 { "operating_temperature": [ { "unit": "celcius", "value": [ { "gte": 30, "lte": 400 } ] } ] }
期望查询操作温度在400-450开尔文范围的文档(预期仅返回文档1),但以下查询未返回任何结果:
GET nested_index/_search { "query": { "bool": { "must": [ { "nested": { "path": "operating_temperature", "query": { "term": { "operating_temperature.unit": { "value": "kelvin" } } } } }, { "nested": { "path": "operating_temperature", "query": { "range": { "operating_temperature.value": { "gte": 400, "lte": 450 } } } } } ] } } }
问题原因
当前查询中,两个nested查询是独立执行的:
- 第一个
nested查询匹配文档1中unit=kelvin的嵌套对象 - 第二个
nested查询匹配文档1中value范围覆盖400-450的嵌套对象(实际是unit=celcius的第二个value项)
由于bool must要求两个条件同时满足,但它们匹配的是文档中不同的嵌套元素,因此整个文档不会被判定为匹配。
正确查询示例
需要将两个条件放入同一个nested查询的bool逻辑中,确保是同一个嵌套对象同时满足单位和数值范围条件:
GET nested_index/_search { "query": { "nested": { "path": "operating_temperature", "query": { "bool": { "must": [ { "term": { "operating_temperature.unit": "kelvin" } }, { "range": { "operating_temperature.value": { "gte": 400, "lte": 450 } } } ] } } } } }
此查询会检查每个operating_temperature嵌套对象,只有当某个对象同时满足unit=kelvin且其value范围与400-450有交集时,才会匹配对应的文档,最终返回预期的文档1。
内容的提问来源于stack exchange,提问作者perryizgr8
相关产品推荐
相关产品推荐

