我有一个索引,用于收集各种网站的web重定向数据。我使用嵌套字段来收集数据,如下面的映射所示:
"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重定向的数量。我想获得基于通配符/regexp与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.*
短语的URL的chain.url.domain
聚合。现在,它正在查看链中的所有url,然后通过doc_count聚合bucket,而不管该url/domain是否具有特定短语。我希望我能够清楚地解释这一点。如何获得结果以显示包含与url的查询字段匹配aff_c.*
短语的域的bucket聚合。
我还想知道如何在通配符或regexp查询中使用=
或/
。如果我在查询中使用上述符号,则不会产生任何结果。
Tha
嵌套查询返回嵌套文档与条件匹配的所有文档,您只能在inner_hits中获得匹配的嵌套文档。聚合应用于这些文档之上,因此所有域都以的形式出现
您需要使用嵌套聚合来只获取匹配的术语。
{
"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而不是regex。它有更好的性能。
标准分析器在生成令牌时删除"/&"&";。所以,如果您想使用regex或通配符来查找这些,您需要使用关键字字段而不是文本字段。