0

我们想要聚合一些值。例如,假设我们正在索引在组织中注册的用户。

我们希望将注册用户数拆分为:

  • 从 gmail 注册:900
  • 通过 fb 注册:800
  • 通过雅虎注册:700
  • 通过自己的应用程序注册:1500
  • 通过他人注册:1600

预计我们需要存储 0 到 1000 个用户(gmail、fb、yahoo - 3 个应用程序)。以及 1001 到 2000(自己的应用程序,其他应用程序 - 2 个应用程序)。需要像上面的场景一样存储。

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

谢谢

4

1 回答 1

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 只是为了有一个较短的响应,因为结果命中不会被返回(见这里)。

您的搜索响应将类似于:

{
   (...)
   "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聚合文档的更多信息。

于 2015-03-13T10:59:29.497 回答