Elasticsearch中的嵌套字段、通配符查询和聚合



我有一个索引,用于收集各种网站的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或通配符来查找这些,您需要使用关键字字段而不是文本字段。

最新更新