Return elasticsearch 中的字符串数组只有一个元素
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]"
}
}
}
但问题是插入这些字符串的顺序可能不同。
我该怎么做?我想了几个办法:
脚本 - 使用像子字符串一样的函数并仅获取 "correct" 个值。
过滤 - 可以从数组中过滤一个值(包含字符串 "device:")。
正在对 strArray 值进行排序以将所有值按一定顺序排列,但是 "sort" 给我奇怪的结果 - return 只有一个元素(没有任何过滤)。
不要问我,为什么我有这个结构(这不是我的选择),如果我们有结构 key: value - 我们就不会有问题。
只能在这里直接编写脚本。
要了解如何在聚合中使用脚本,您可以参考此 blog.
像下面这样的东西应该可以工作
for(element in doc['strArray'].values){
if(element.startsWith('browser')){
return element;
}
};
return null;
排序和过滤都是在文档级别而不是元素级别完成的。
在元素级别,如果您可以将此数组设置为 nested ,则可以进行过滤。那首先你需要将结构更改为 -
strArray: [
{ "name" : 'browser:IE' } ,
{ "name" : 'device:PC' }
]
然后将 strArray 字段设为嵌套。
在这种情况下,您可以根据前缀查询(使用查询过滤器)进行嵌套筛选,然后对数据进行嵌套聚合。
我在一个字段中有一组字符串 "strArray":
strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA']
我需要按浏览器(设备、国家或州)进行汇总。如果我知道这些值在 strArray 字段中的顺序,这不是问题。
我可以使用那些结构:
"aggs": {
"deviceAggs": {
"terms": {
"script": "doc['strArray'][1]"
}
}
}
但问题是插入这些字符串的顺序可能不同。
我该怎么做?我想了几个办法:
脚本 - 使用像子字符串一样的函数并仅获取 "correct" 个值。
过滤 - 可以从数组中过滤一个值(包含字符串 "device:")。
正在对 strArray 值进行排序以将所有值按一定顺序排列,但是 "sort" 给我奇怪的结果 - return 只有一个元素(没有任何过滤)。
不要问我,为什么我有这个结构(这不是我的选择),如果我们有结构 key: value - 我们就不会有问题。
只能在这里直接编写脚本。 要了解如何在聚合中使用脚本,您可以参考此 blog.
像下面这样的东西应该可以工作
for(element in doc['strArray'].values){
if(element.startsWith('browser')){
return element;
}
};
return null;
排序和过滤都是在文档级别而不是元素级别完成的。 在元素级别,如果您可以将此数组设置为 nested ,则可以进行过滤。那首先你需要将结构更改为 -
strArray: [
{ "name" : 'browser:IE' } ,
{ "name" : 'device:PC' }
]
然后将 strArray 字段设为嵌套。 在这种情况下,您可以根据前缀查询(使用查询过滤器)进行嵌套筛选,然后对数据进行嵌套聚合。