Elasticsearch,按数组字段的值聚合

Elasticsearch, aggregate by array field's value

我的文档是这样的:

[
    {
        '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"]
    }
]

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

{
"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'}}}

您无法获得文本类型字段的聚合(如果您仍想生成文本类型字段的聚合,则应使用 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
      }
    }
  }
}