当前位置: 首页 > 知识库问答 >
问题:

按桶键值过滤Elasticsearch聚合

万阳嘉
2023-03-14

我有一个Elasticsearch文档索引,其中有一个包含URL列表的字段。如预期的那样,在该字段上聚合会给我唯一URL的计数。

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

然后,我想过滤掉其键不包含特定字符串的桶。我已经尝试使用Bucket选择器聚合来实现这一点。

此尝试:

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\u key\u filter]且类型为[bucket\u selector]的管道聚合无效。顶层仅允许同级管道聚合

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

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')"
      }
    }
  }
}

失败原因:

在[链接]中找到两个聚合类型定义:[术语]和[bucket_selector]

我将继续修补,但目前有点卡住了:(

共有3个答案

单昊穹
2023-03-14

您可以使用“\u 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')"
      }
    }
  }
}
施俊驰
2023-03-14
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')"
      }
  }
}

您的选择器应该升级,它应该直接在aggs中并与您的选择器组平行。我不确定密钥过滤

尉迟宇定
2023-03-14

您将无法使用bucket_选择器,因为它的bucket_路径

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

术语聚合产生的内容表示为String条款-无论您是否强制使用占位符多桶聚合,这都不会起作用。

假设链接是关键字数组

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

顺便说一句,使用这样的正则表达式会产生一些非常重要的影响,特别是当你想象一个区分大小写的场景,在这种场景中,你需要一个查询时间生成的正则表达式-正如在如何使用include和regex在elasticsearch中正确查询术语内部聚合值中所讨论的那样?

 类似资料:
  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要

  • 以下是数据集的快照: 我想获得员工名单以及employeeStatus和employeeAddr。 所以我在employeeId上使用术语聚合,然后使用employeeStatus和employeeAddr的子聚合来获得这些详细信息。下面的查询正确返回结果。 现在我只想要永久身份的员工。所以我正在应用过滤器聚合。 现在的问题是雇员地址聚合没有为雇员地址返回存储桶,因为记录2在聚合完成之前就被过滤掉

  • 不知道如何表达这个问题。我正在使用Elasticsearch 2.2。 让我们从数据集的一个示例开始,该数据集由5个文档组成: 被调用的\u实体始终具有uuid。coverage\u实体可以为空,也可以具有uuid。 我使用脚本在任何一个被调用的\实体上进行聚合。uuid或coverage\u实体。uuid: 现在,聚合已经从任一头生成了术语。调用了\u实体。uuid或标头。coverage\u实

  • 我想根据字段中的关键字出现来制作桶。 我检查了elasticsearch留档,发现过滤器聚合应该很合适:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html#search-aggregations-bucket-filte

  • 数据 我在ES索引中保留了对象。其中每个字段都有一个myKey和myName字符串字段(持久化为关键字字段)。不能保证同一个myKey的myName总是相同的。E、 g.以下两个条目共享相同的myKey,但具有不同的myName值: 挑战 我需要选择并返回所有不同的myKey值,查找并显示最可能的myName(myKey上下文中出现的最多),并按myName对生成的Bucket进行排序。 到目前为

  • 我如何对键上的elasticsearch聚合桶进行排序。我有嵌套的聚合,想对我的第二个聚合桶结果进行排序。 就像我有: 我希望我的< code >事件聚集桶在关键< code >印象或< code >页面视图上按desc/asc排序。我如何实现这样的结果集? 这是我的查询 我试过使用_key,但它在桶内排序。我想通过查看所有桶来排序。就像我有一个键。我希望我的桶结果用这个键排序。不在桶内。 我希望