Elasticsearch 中的嵌套字段、通配符查询和聚合
Nested Fields, Wildcard Queries and Aggregations in Elasticsearch
我有一个索引可以收集各种网站的网络重定向数据。我正在使用嵌套字段来收集数据,如下面的映射所示:
"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 重定向的数量。我想获得基于 wildcard/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 聚合桶,而不管 url/domain 是否具有特定短语。我希望我能够清楚地解释这一点。如何让我的结果显示包含域的存储桶聚合,这些域的 aff_c.*
词组与 url.
的查询字段匹配
我还想知道如何在我的通配符或正则表达式查询中使用 =
或 /
。如果我在查询中使用上述符号,它不会产生任何结果。
你
嵌套查询 returns 嵌套文档符合条件的所有文档,您只在 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 在生成令牌时删除“/”、“=”。所以如果你想使用正则表达式或通配符来查找这些,你需要使用关键字字段而不是文本字段。
我有一个索引可以收集各种网站的网络重定向数据。我正在使用嵌套字段来收集数据,如下面的映射所示:
"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 重定向的数量。我想获得基于 wildcard/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 聚合桶,而不管 url/domain 是否具有特定短语。我希望我能够清楚地解释这一点。如何让我的结果显示包含域的存储桶聚合,这些域的 aff_c.*
词组与 url.
我还想知道如何在我的通配符或正则表达式查询中使用 =
或 /
。如果我在查询中使用上述符号,它不会产生任何结果。
你
嵌套查询 returns 嵌套文档符合条件的所有文档,您只在 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 在生成令牌时删除“/”、“=”。所以如果你想使用正则表达式或通配符来查找这些,你需要使用关键字字段而不是文本字段。