gpt4 book ai didi

elasticsearch - Elasticsearch由多个字段分别聚合

转载 作者:行者123 更新时间:2023-12-02 23:29:29 24 4
gpt4 key购买 nike

我有一个包含2个字段和一些文档的索引,如下所示:

city                team
=========================================
New York New York Knicks
New York Brooklyn Nets
New Orleans New Orleans Pelicans

我的目标是提供一个自动搜索两个字段,例如:
Query: [ new                  ]
+----------------------+
| Cities |
+----------------------+
| New York |
| New Orleans |
+----------------------|
| Teams |
+----------------------|
| New York Knicks |
| New Orleans Pelicans |
+----------------------+

我的查询来过滤文档非常简单:
"query": {
"bool": {
"should": [
{
"match_phrase_prefix": {
"city": "new"
}
},
{
"match_phrase_prefix": {
"team": "new"
}
}
]
}
}

但是,我在聚合方面遇到了麻烦。我的第一种方法是:
"aggs": {
"city": {
"terms": {
"field": "city.raw"
}
},
"team": {
"terms": {
"field": "team.raw"
}
}
}

( raw是用于聚合目的的 not_analyzed字段副本)

这不起作用,因为结果中包含了 Brooklyn Nets,并且它不应该:
"aggregations": {
"city": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "New York",
"doc_count": 2
},
{
"key": "New Orleans",
"doc_count": 1
}
]
},
"team": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "Brooklyn Nets",
"doc_count": 1
},
{
"key": "New Orleans Pelicans",
"doc_count": 1
},
{
"key": "New York Knicks",
"doc_count": 1
}
]
}
}

我不知道如何使用单个请求使其工作。
该示例仅是说明性的,在实际情况下,我还有很多要搜索和汇总的字段和文档,因此对服务器进行多次请求将不是一个好主意,尤其是因为自动完成系统应尽可能快。

任何帮助将不胜感激。

最佳答案

您需要一个过滤器聚合来根据查询本身中的过滤器来过滤要聚合的文档:

  "aggs": {
"city": {
"filter": {
"bool": {
"must": [
{
"query": {
"match_phrase_prefix": {
"city": "new"
}
}
}
]
}
},
"aggs": {
"cities": {
"terms": {
"field": "city.raw"
}
}
}
},
"team": {
"filter": {
"bool": {
"must": [
{
"query": {
"match_phrase_prefix": {
"team": "new"
}
}
}
]
}
},
"aggs": {
"cities": {
"terms": {
"field": "team.raw"
}
}
}
}
}

关于elasticsearch - Elasticsearch由多个字段分别聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210223/

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