我在一个字段中有字符串数组" strArray":
strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA']
我需要通过浏览器(设备,国家或州)进行聚合。如果我知道strArray字段中这些值的顺序,那不是问题。
我可以使用这些结构:
"aggs": {
"deviceAggs": {
"terms": {
"script": "doc['strArray'][1]"
}
}
}
但问题是插入这些字符串的顺序可能不同。
我该怎么做?我想了几个方法:
脚本编写 - 使用类似子字符串的函数,只获取"正确"值。
过滤 - 可以从数组中过滤掉一个值(包含字符串" device:")。
对strArray值进行排序,使所有值按照确定的顺序排列,但是"排序"给我奇怪的结果 - 只返回一个元素(没有任何过滤)。
不要问我,为什么我有这种结构(这不是我的选择),如果我们有结构键:价值 - 我们不会有问题。
答案 0 :(得分:2)
脚本只能在这里直接使用。 要了解如何在聚合中使用脚本,您可以参考此blog。
下面的内容应该有效
for(element in doc['strArray'].values){
if(element.startsWith('browser')){
return element;
}
};
return null;
排序和过滤都是在文档级别而非元素级别完成的。 在元素级别,如果可以将此数组设置为嵌套,则可以进行过滤。首先,您需要将结构更改为 -
strArray: [
{ "name" : 'browser:IE' } ,
{ "name" : 'device:PC' }
]
然后将strArray字段设置为嵌套。 在这种情况下,您可以基于前缀查询(使用查询过滤器)执行嵌套过滤器,然后对数据执行嵌套聚合。