【问题标题】:Elasticsearch, aggregate by array field's valueElasticsearch,按数组字段的值聚合
【发布时间】:2022-01-14 18:26:19
【问题描述】:

我的文档如下所示:

[
    {
        'user_id': 1,
        'search_text': 'hi',
        'searched_departments': ["dep4", "dep5", "dep6"]
    },
    {
        'user_id': 1,
        'search_text': 'hi there',
        'searched_departments': ["dep4", "dep6"]
    },
    {
        'user_id': 5,
        'search_text': 'I like candy',
        'searched_departments': ["dep4", "dep11", "dep999"]
    },
    {
        'user_id': 2,
        'search_text': 'hi',
        'searched_departments': ["dep4", "dep6", "dep7"]
    }
]

我想做一个返回每个部门计数的聚合, 所以在这种情况下,我希望我的最终结果是这样的:

{
"dep4" : 4,
"dep6" : 3,
"dep5" : 1,
# and so on
}

我的映射:

{'mappings': {'properties': {'date': {'type': 'date'},
                             'searched_departments': {'type': 'text'},
                             'search_text': {'type': 'text'},
                             'user_id': {'type': 'text'}}}

【问题讨论】:

  • 请添加索引映射,以便于理解。
  • @SagarPatel 已更新 :)

标签: elasticsearch elasticsearch-aggregation


【解决方案1】:

您不能对文本类型的字段进行聚合(如果您仍想对文本类型的字段生成聚合,则应使用fielddata 参数启用字段true)。为了获得聚合,您可以将searched_departments 字段定义为multi field,其中包含关键字和文本两种类型。

以下是示例映射:

{
    "mappings": {
        "properties": {
            "date": {
                "type": "date"
            },
            "searched_departments": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                    }
                }
            },
            "search_text": {
                "type": "text"
            },
            "user_id": {
                "type": "text"
            }
        }
    }
}

那么下面的查询会给你预期的结果:

POST index_name/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "dept_count": {
      "terms": {
        "field": "searched_departments.keyword",
        "size": 10
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2018-06-13
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多