按存储桶键值

时间:2017-11-23 14:59:09

标签: elasticsearch key-value aggregation bucket

我有一个Elasticsearch文档索引,其中有一个包含URL列表的字段。在此字段上聚合可以按预期为我提供唯一URL的计数。

GET models*/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "links": {
      "terms": {
        "field": "links.keyword",
        "size": 10
      }
    }
  }
}

然后我想过滤掉其键不包含某个字符串的存储桶。我已尝试使用Bucket Selector Aggregation

这次尝试:

GET models*/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "links": {
      "terms": {
        "field": "links.keyword",
        "size": 10
      }
    },
    "links_key_filter": {
      "bucket_selector": {
        "buckets_path": {
          "key": "links"
        },
        "script": "!key.contains('foo')"
      }
    }
  }
}

失败:

  

名为[links_key_filter]的无效管道聚合类型   [bucket_selector]。只允许兄弟管道聚合   顶级

将桶选择器放在链接聚合中,如下所示:

GET models*/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "links": {
      "terms": {
        "field": "links.keyword",
        "size": 10
      },
      "bucket_selector": {
        "buckets_path": {
          "key": "links"
        },
        "script": "!key.contains('foo')"
      }
    }
  }
}

失败了:

  

在[links]中找到两个聚合类型定义:[terms]和[bucket_selector]

我要继续修修补补,但此刻有点卡住了:(

2 个答案:

答案 0 :(得分:0)

您可以使用“ _key”获取密钥:

GET models*/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "links": {
      "terms": {
        "field": "links.keyword",
        "size": 10
      },
      "bucket_selector": {
        "buckets_path": {
          "key": "_key"
        },
        "script": "!params.key.contains('foo')"
      }
    }
  }
}

答案 1 :(得分:0)

将无法使用 bucket_selector,因为它的 bucket_path

<块引用>

必须引用数字值或单值数字度量聚合[source]

并且 terms 聚合产生的内容表示为 StringTerms — 无论您是否 force a placeholder multibucket aggregation,这都行不通。

话虽如此,每个 terms 聚合都支持 exclude filter

假设您的链接是关键字数组:

POST models/_doc/1
{
  "links": [
    "google.com",
    "wikipedia.org"
  ]
}

POST models/_doc/2
{
  "links": [
    "reddit.com",
    "google.com"
  ]
}

并且您想对除 reddit 之外的所有内容进行分组,您可以使用以下正则表达式:

POST models*/_search
{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "links": {
      "terms": {
        "field": "links.keyword",
        "exclude": ".*reddit.*",    <-- 
        "size": 10
      }
    }
  }
}

顺便说一句,使用此类正则表达式会产生一些重要的影响,尤其是。当您想象一个区分大小写的场景时,您需要一个查询时间生成的正则表达式 - 如 How to correctly query inside of terms aggregate values in elasticsearch, using include and regex?

中所述