gpt4 book ai didi

elasticsearch - Fast elasticsearch CASE WHEN THEN ELSE 等效?

转载 作者:行者123 更新时间:2023-11-29 02:56:06 24 4
gpt4 key购买 nike

我需要在 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 中是否有任何语言支持像这样的独占存储?或者会产​​生相同结果的任何其他更快的方法?

谢谢!

最佳答案

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

SELECT
CASE WHEN <filter1> THEN <bin_1>
WHEN <filter2> THEN <bin_2>
ELSE <bin_else>
END as binning
FROM SOMETHING

使用无痛语言的脚本字段实现。如此处所述:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html在这里无痛: https://www.elastic.co/guide/en/elasticsearch/painless/5.6/painless-examples.html

GET _search
{
"query" : { "match_all": {} },
"script fields" : {
"binning" : {
"script" : {
"lang": "painless",
"source": "if (<filter>) {return <bin1>;} else if (<filter2>) {return <bin2>;} else {return <bin3>;}"
}
}
}

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

关于elasticsearch - Fast elasticsearch CASE WHEN THEN ELSE 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39014091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com