gpt4 book ai didi

elasticsearch - 弹性,我可以将我自己的全局序号与无痛术语聚合脚本一起使用吗?

转载 作者:行者123 更新时间:2023-12-02 23:51:39 30 4
gpt4 key购买 nike

这是我的一份文件可能看起来像的


{
"CC":{"colors":["Blue","Green","Yellow"]},
"CN":{"colors":["White","Green","Blue"]},
"WA":{"colors":["Orange","Green","Blue"]},
...
}

我想在两个字段 CC.colorsCN.colors的交集处进行术语汇总。也就是说,对于本文档,该字段在交点处将具有 ["Green", "Blue"],我希望在该交点处进行术语汇总。

据我了解,有两种方法可以做到这一点。

1)用聚合的方式编写的无痛脚本,它为每个文档返回这两个数组的交集。
2)在索引时间创建的新字段,可能称为 CC_CN.colors,其中包含所有文档的交集。

我无法继续进行2,因为我的组合太多了。搜索期间我可以有任何需求,例如CC_CN或CC_WA或WA_CN_CC等。

对于1),它可以工作,但是会变得很慢。原因之一是1)无法使用全局序数。

有什么技巧可以让我要求Elastic为我的无痛术语聚合构建自定义全局序号吗?我知道我的系统中只有25种颜色,因此可以让所有颜色在某处具有 flex ,并“确保”它们除了聚合后的这些颜色之外,我不会返回其他任何东西吗?

或者,如果我编码并存储数字而不是索引中的字符串,那么 flex 处理会更快吗?例如0代替“Black”,1代替“Green”,等等?

除了交叉点,我的其他用例也涉及联合等。谢谢阅读!

最佳答案

为了自己回答,我们最终在_source中请求这些数组,并在Ruby中执行并集/交集。

也可以毫不费力地执行此操作,从而提供更好的性能。 Elastic使用map进行聚合,但我想不出任何使用全局序数的方法。我认为这不可能。

我们编写了生成无痛代码的代码,以执行数组之间的交集和联合。
对于任何 future 的流浪者,生成的代码如下所示:

这是为了工会:

Stream stream = [].stream();
String[] stream_keys = new String[] {'CC.colors', 'CN.colors'};

for (int i = 0; i < stream_keys.length; ++i) {
if (doc.containsKey(stream_keys[i])) {
stream = Stream.concat(stream, doc[stream_keys[i]].stream());
}
}
stream = stream.distinct();

这是交集(流,list_0_stream和list_1_stream交集):
List list_0 = list_0_stream.collect(Collectors.toList());
List list_1 = list_1_stream.collect(Collectors.toList());
return stream.filter(list_0::contains).filter(list_1::contains).toArray();

表现似乎可以接受。

关于elasticsearch - 弹性,我可以将我自己的全局序号与无痛术语聚合脚本一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57214358/

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