Elasticsearch聚合和范围

时间:2015-03-13 09:05:19

标签: elasticsearch elasticsearch-plugin spring-data-elasticsearch

我们希望汇总一些价值。例如,我们假设我们正在为在组织中注册的用户编制索引。

我们希望让注册用户的数量分为:

  • 从gmail注册:900
  • 通过fb:800
  • 注册
  • 通过雅虎注册:700
  • 通过自己的申请注册:1500
  • 通过他人注册:1600

预计我们需要使用0到1000个用户(gmail,fb,yahoo - 3个应用程序)。和1001到2000(自己的应用程序,其他应用程序 - 2个应用程序)。需要像上面那样的方案。

我们如何在弹性搜索中实现这一目标?有什么建议吗?

由于

1 个答案:

答案 0 :(得分:0)

假设您正在索引用户对象,如下所示:

POST users/user
{
  "login":"user1",
  "organization":"fb"
}

您正在尝试按其organization值汇总用户。为此,您必须使用terms聚合。

您的查询将如下所示:

POST users/_search?search_type=count
{
  "aggs": {
    "by_organization": {
      "terms": {
        "field": "organization"
      }
    }
  }
}

注意:search_type = count仅用于缩短响应,因为不会返回匹配(请参阅here)。

您的搜索响应类似于:

{
   (...)
   "aggregations": {
      "by_organization": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "app",
               "doc_count": 4
            },
            {
               "key": "fb",
               "doc_count": 3
            },
            {
               "key": "gmail",
               "doc_count": 2
            }
         ]
      }
   }
}

您可以看到与每个组织值对应的存储桶。

请注意:

  • 默认情况下仅返回前10个存储桶(请参阅size聚合的terms参数)
  • 这个简单的示例适用于组织值很简单,但在现实生活中,您必须将组织字段设置为not_analyzed,以便汇总原始值(而不是通过分析获得的术语)

我强烈邀请您详细了解分析以及terms汇总documentation