我有一个索引,收集各种网站的网络重定向数据。我使用一个嵌套的字段来收集数据,如下面的映射所示:
"chain": {
"type": "nested",
"properties": {
"url.position": {
"type": "long"
},
"url.full": {
"type": "text"
},
"url.domain": {
"type": "keyword"
},
"url.path": {
"type": "keyword"
},
"url.query": {
"type": "text"
}
}
}
可以想象,每个文档都包含一个url链数组,数组的大小等于web重定向的数量。我想获得基于通配符/正则表达式匹配到url.query
字段的聚合。以下是一个示例查询:
GET push_url_chain/_search
{
"query": {
"nested": {
"path": "chain",
"query": {
"regexp": {
"chain.url.query": "aff_c.*"
}
}
}
},
"size": 0,
"aggs": {
"dataFields": {
"nested": {
"path": "chain"
},
"aggs": {
"offers": {
"terms": {
"field": "chain.url.domain",
"size": 30
}
}
}
}
}
}
上面的查询确实产生了聚合结果,但不是我想要的方式。我希望看到包含aff_c.*
短语的urls的chain.url.domain
聚合。现在,它正在查看链中的所有url,然后通过doc_count聚合存储桶,而不管该url/域是否具有特定的短语。我希望我已经能够清楚地解释这一点。如何获得结果以显示存储桶聚合,这些存储桶聚合包含aff_c.*
短语与url的查询字段匹配的域。
我还想知道如何在我的通配符或正则表达式查询中使用=
或/
。如果我在查询中使用上面的符号,它不会产生任何结果。
Tha
发布于 2021-06-27 15:59:36
嵌套查询将返回嵌套文档与条件匹配的所有文档,您只能在inner_hits中获得匹配的嵌套文档。聚合是在这些文档之上应用的,所以所有的域都是以术语形式出现的
您需要使用nested aggregation来仅获取匹配的术语。
{
"size": 0,
"aggs": {
"Name": {
"nested": {
"path": "chain"
},
"aggs": {
"matched_doc": {
"filter": { --> filter for url
"match_phrase_prefix": {
"chain.url.query": "abc"
}
},
"aggs": {
"domain": {
"terms": {
"field": "chain.url.domain", -- terms for matched url
"size": 10
}
}
}
}
}
}
}
}
您可以使用match_phrase_prefix代替正则表达式。它有更好的性能。
生成令牌时的Standard analyzer删除"/“、"=”。因此,如果要使用正则表达式或通配符并查找它们,则需要使用关键字字段而不是文本字段。
https://stackoverflow.com/questions/68148535
复制相似问题