【发布时间】:2016-08-18 09:06:08
【问题描述】:
我需要在 Elasticsearch 中构建一个独占的分桶聚合(即,将文档分配给第一个存储桶以满足条件,而不是所有满足条件的存储桶,因为过滤器可能重叠 - 这与 CASE WHEN 的行为相同在 SQL 环境中使用 THEN ELSE)。目前我正在使用Filters Aggregation 加上Bool Query/Filter 来实现我想要的。这个想法是使用“Bool Query”的“must”和“must_not”部分,其中“must”是我的过滤器,“must_not”是之前已经使用过的所有其他过滤器的集合。一个例子是:
GET _search
{
"query":{"match_all":{}},
"size":0,
"aggs":{
"bin_1": {
"filter": {
"bool": {
"must": { <filter1> },
"must_not": { <empty> }
}
}
},
"bin_2": {
"filter": {
"bool": {
"must": { <filter2> },
"must_not": { <filter1> }
}
}
},
"bin_3": {
"filter": {
"bool": {
"must": { <filter3> },
"must_not": { <filter1>, <filter2> }
}
}
},
"bin_else": {
"filter": {
"bool": {
"must": { <empty> },
"must_not": { <filter1>, <filter2>, <filter3> }
}
}
}
}
}
在关系方法中,CASE WHEN 子句可以实现同样的效果,如下所示:
CASE WHEN <filter1> THEN <bin_1>
WHEN <filter2> THEN <bin_2>
WHEN <filter3> THEN <bin_3>
ELSE <bin_else>
END
这种方法的问题在于,我添加的存储桶越多,它就越慢(在我的实际情况中,我什至有嵌套的存储桶)。在 Elastic 中是否有任何语言支持像这样的独占分桶?或者任何其他更快的方法会产生相同的结果?
谢谢!
【问题讨论】:
标签: elasticsearch