elasticsearch Fast elasticsearch CASE在其他情况下是否等效?,elasticsearch,elasticsearch" /> elasticsearch Fast elasticsearch CASE在其他情况下是否等效?,elasticsearch,elasticsearch" />

elasticsearch Fast elasticsearch CASE在其他情况下是否等效?

elasticsearch Fast elasticsearch CASE在其他情况下是否等效?,elasticsearch,elasticsearch,我需要在Elasticsearch中构建一个独占bucketing聚合(即,将文档分配给第一个bucket以满足标准,而不是所有满足该标准的bucket,因为过滤器可能重叠-这与SQL环境中的其他情况相同)。目前我正在使用a和a来实现我想要的。想法是使用“Bool查询”中的“必须”和“不得”部分,其中“必须”是我的过滤器,“不得”是以前使用过的所有其他过滤器的集合。例如: GET _search { "query":{"match_all":{}}, "size":0,

我需要在Elasticsearch中构建一个独占bucketing聚合(即,将文档分配给第一个bucket以满足标准,而不是所有满足该标准的bucket,因为过滤器可能重叠-这与SQL环境中的其他情况相同)。目前我正在使用a和a来实现我想要的。想法是使用“Bool查询”中的“必须”和“不得”部分,其中“必须”是我的过滤器,“不得”是以前使用过的所有其他过滤器的集合。例如:

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> }
                }
            }
        }
    }
}
GET\u搜索
{
“查询”:{“匹配所有”:{},
“大小”:0,
“aggs”:{
“bin_1”:{
“过滤器”:{
“布尔”:{
“必须”:{},
“不得”:{}
}
}
},
“bin_2”:{
“过滤器”:{
“布尔”:{
“必须”:{},
“不得”:{}
}
}
},
“bin_3”:{
“过滤器”:{
“布尔”:{
“必须”:{},
“不得”:{,}
}
}
},
“其他人”:{
“过滤器”:{
“布尔”:{
“必须”:{},
“不得”:{,}
}
}
}
}
}
在关系方法中,CASE-WHEN子句也可以达到同样的效果,如:

CASE WHEN <filter1> THEN <bin_1>
     WHEN <filter2> THEN <bin_2>
     WHEN <filter3> THEN <bin_3>
     ELSE <bin_else>
END
CASE当
什么时候
什么时候
其他的
结束
这种方法的问题是,我添加的bucket越多,速度就越慢(在我的实际情况中,我甚至有嵌套的bucket)。在Elastic中是否有任何语言支持这样的排他性扣合?或者任何其他能产生相同结果的更快的方法


谢谢大家!

我认为解决方案是编写字段脚本。它将使用if-else逻辑,因此不会使用额外的条件。只是我不知道你在使用什么样的过滤器,但我认为应该可以实现任何东西。我会在这里写一个相当于

SELECT
CASE WHEN <filter1> THEN <bin_1>
     WHEN <filter2> THEN <bin_2>
     ELSE <bin_else>
END as binning
FROM SOMETHING
选择
那么什么时候呢
什么时候
其他的
以装箱结束
来自某物
使用无痛语言中的脚本字段实现。如下所述:

这里没有痛苦:

GET\u搜索
{
“查询”:{“匹配所有”:{},
“脚本字段”:{
“宾宁”:{
“脚本”:{
“郎”:“无痛”,
“源”:“if(){return;}else if(){return;}else{return;}”
}
}
}

其中“过滤器”类似于:doc['my_field']。value==“value1”其中“my_field”是您在筛选器中使用的字段。

我没有想到使用脚本字段!好主意,谢谢@Honza。不过,您对性能有什么想法吗?我怀疑脚本字段与普通
bool
筛选器相比相当昂贵。
GET _search
{
"query" : { "match_all": {} },
"script fields" : {
    "binning" : {
        "script" : {
            "lang": "painless",
            "source": "if (<filter>) {return <bin1>;} else if (<filter2>) {return <bin2>;} else {return <bin3>;}"
        }
    }
}