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]"
    }
  }
}

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

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

  1. 脚本 - 使用像子字符串一样的函数并仅获取 "correct" 个值。

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

  3. 正在对 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 字段设为嵌套。 在这种情况下,您可以根据前缀查询(使用查询过滤器)进行嵌套筛选,然后对数据进行嵌套聚合。