[英]Return only one element from strings array in elasticsearch
我在一个字段“strArray”中有字符串数组:
strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA']
我需要按浏览器(设备、国家或州)进行聚合。 如果我知道 strArray 字段中这些值的顺序,这不是问题。
我可以使用这些结构:
"aggs": {
"deviceAggs": {
"terms": {
"script": "doc['strArray'][1]"
}
}
}
但问题是插入这些字符串的顺序可能不同。
我怎样才能做到这一点 ? 我想了几个方法:
脚本 - 将函数用作子字符串并仅获取“正确”值。
过滤 - 可以从数组中过滤一个值(包含字符串“device:”)。
对 strArray 值进行排序以将所有值按确定的顺序排列,但是“排序”给了我奇怪的结果 - 只返回一个元素(没有任何过滤)。
不要问我,为什么我有这个结构(这不是我的选择),如果我们有结构 key: value - 我们就不会有问题。
在这里只能直接编写脚本。 要了解如何在聚合中使用脚本,您可以参考此博客。
像下面这样的东西应该工作
for(element in doc['strArray'].values){
if(element.startsWith('browser')){
return element;
}
};
return null;
排序和过滤都是在文档级别而不是元素级别完成的。 在元素级别,如果您可以将此数组设为嵌套,则可以进行过滤。 首先,您需要将结构更改为-
strArray: [
{ "name" : 'browser:IE' } ,
{ "name" : 'device:PC' }
]
然后使 strArray 字段嵌套。 在这种情况下,您可以根据前缀查询(使用查询过滤器)执行嵌套过滤器,然后对数据执行嵌套聚合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.