如何在不修改索引的情况下实现Elasticsearch数组区间范围查询?
解决Elasticsearch数组区间的Range查询问题
没问题!这个坑我之前也踩过——普通的range查询在处理数组字段时,是找数组里单个元素同时满足gt和lt的条件,但你的场景里,facetProperties.fid641616数组其实是表示一个连续的数值区间(第一个值是区间下限,第二个是上限),你要找的是这个区间和查询范围有重叠的文档,对吧?
为什么原查询失效?
你原来的查询要求数组中存在某个元素同时大于33且小于42,但像[31,45]这样的数组,31小于33、45大于42,没有任何单个元素能同时满足两个条件,所以自然返回空结果。
不修改索引的解决方案
我们可以把查询逻辑换成判断两个区间是否重叠的规则:如果文档的区间[a, b]和查询区间[c, d](这里是33到42)有重叠,必须满足a < d 且 b > c。
对应到Elasticsearch的查询,我们可以通过数组下标访问区间的上下限,并用bool的must组合两个range条件:
{ "query": { "bool": { "must": [ { "range": { "facetProperties.fid641616.0": { "lt": 42 } } }, { "range": { "facetProperties.fid641616.1": { "gt": 33 } } } ] } }, "from": 0, "size": 250, "sort": [], "aggs": {}, "_source": "facetProperties.fid641616" }
验证你的用例
facet1: [31]:假设这是区间上下限均为31,31 < 42成立,但31 > 33不成立,所以不匹配,符合预期。facet2: [31,45]:31 < 42且45 > 33,两个条件都满足,会被匹配,正确。facet1: [31,32]:32 > 33不成立,不匹配,正确。facet1: [44,45]:44 < 42不成立,不匹配,正确。
内容的提问来源于stack exchange,提问作者mooor
相关产品推荐
相关产品推荐

