gpt4 book ai didi

由唯一子字符串聚合的 Elasticsearch 查询(电子邮件域)

转载 作者:行者123 更新时间:2023-11-29 02:50:07 25 4
gpt4 key购买 nike

我有一个 elasticsearch 查询,它查询一个索引,然后根据特定字段 sender_not_analyzed 进行聚合。然后,我在同一字段 sender_not_analyzed 上使用术语聚合,它返回顶级“发件人”的存储桶。我的查询当前是:

{
"size": 0,
"query": {
"regexp": {
"sender_not_analyzed": ".*[@].*"
}
},
"aggs": {
"sender-stats": {
"terms": {
"field": "sender_not_analyzed"
}
}
}
}

返回的桶看起来像:

"aggregations": {
"sender-stats": {
"buckets": [
{
"key": "<Mike <mike@fizzbuzz.com>@MISSING_DOMAIN>",
"doc_count": 5017
},
{
"key": "jon.doe@foo.com",
"doc_count": 3963
},
{
"key": "jane.doe@foo.com",
"doc_count": 2857
},
{
"key": "jon.doe@bar.com",
"doc_count":1544
}

我如何编写一个聚合,以便为每个唯一的电子邮件域获得单个存储桶,例如 foo.com 将具有 (3963 + 2857) 6820 的 doc_count ?我可以使用正则表达式聚合来完成此操作,还是需要编写某种自定义分析器来将 @ 处的字符串拆分到字符串末尾?

最佳答案

这已经很晚了,但我认为这可以通过使用 pattern_replace char filter 来完成,你用regex抓取域名,这是我的设置

POST email_index
{
"settings": {
"analysis": {
"analyzer": {
"my_custom_analyzer": {
"char_filter": [
"domain"
],
"tokenizer": "keyword",
"filter": [
"lowercase",
"asciifolding"
]
}
},
"char_filter": {
"domain": {
"type": "pattern_replace",
"pattern": ".*@(.*)",
"replacement": "$1"
}
}
}
},
"mappings": {
"your_type": {
"properties": {
"domain": {
"type": "string",
"analyzer": "my_custom_analyzer"
},
"sender_not_analyzed": {
"type": "string",
"index": "not_analyzed",
"copy_to": "domain"
}
}
}
}
}

这里domain char filter会抓取域名,我们需要使用keyword tokenizer为了按原样获取域,我正在使用 lowercase 过滤器,但是否要使用它取决于您。使用 copy_to参数将 sender_not_analyzed 的值复制到 domain 字段,虽然 _source 字段不会被修改为包含该值,但我们可以查询它.

GET email_index/_search
{
"size": 0,
"query": {
"regexp": {
"sender_not_analyzed": ".*[@].*"
}
},
"aggs": {
"sender-stats": {
"terms": {
"field": "domain"
}
}
}
}

这会给你想要的结果。

关于由唯一子字符串聚合的 Elasticsearch 查询(电子邮件域),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23156983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com