繁体   English   中英

在elasticsearch中只从strings数组中返回一个元素

[英]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. 脚本 - 将函数用作子字符串并仅获取“正确”值。

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

  3. 对 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM