我有一个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]
我要继续修修补补,但此刻有点卡住了:(
答案 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?
中所述