仅返回elasticsearch中strings数组中的一个元素

时间:2015-08-28 09:23:03

标签: arrays elasticsearch filtering aggregate-functions

我在一个字段中有字符串数组" strArray":

strArray: ['browser:IE', 'device:PC', 'country:USA', 'state:CA']

我需要通过浏览器(设备,国家或州)进行聚合。如果我知道strArray字段中这些值的顺序,那不是问题。

我可以使用这些结构:

"aggs": {
  "deviceAggs": {
    "terms": {
      "script": "doc['strArray'][1]"
    }
  }
}

但问题是插入这些字符串的顺序可能不同。

我该怎么做?我想了几个方法:

  1. 脚本编写 - 使用类似子字符串的函数,只获取"正确"值。

  2. 过滤 - 可以从数组中过滤掉一个值(包含字符串" device:")。

  3. 对strArray值进行排序,使所有值按照确定的顺序排列,但是"排序"给我奇怪的结果 - 只返回一个元素(没有任何过滤)。

  4. 不要问我,为什么我有这种结构(这不是我的选择),如果我们有结构键:价值 - 我们不会有问题。

1 个答案:

答案 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字段设置为嵌套。 在这种情况下,您可以基于前缀查询(使用查询过滤器)执行嵌套过滤器,然后对数据执行嵌套聚合。