Elasticsearch:过滤热门点击聚合

cjb*_*aro 7 elasticsearch

假设我有一个带有大量用户评论的 Elasticsearch 索引:

{ "name": "chris", "date": "2016-01-01", "msg": "hi, foo"}
{ "name": "chris", "date": "2016-01-05", "msg": "bye, bar"}
{ "name": "aaron", "date": "2016-01-10", "msg": "who's bar"}
{ "name": "aaron", "date": "2016-01-15", "msg": "not foo"}
Run Code Online (Sandbox Code Playgroud)

首先,我想找到每个用户的最新评论。我可以通过top_hits聚合来做到这一点:

"aggs": {
    "name": {
      "terms": { "field": "name" },
      "aggs": {
        "latest_comment": {
          "top_hits": {
            "sort": [ {"date": { "order": "desc" } } ],
            "size": 1
            }
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

这有效地给了我以下内容:

{ "name": "chris", "date": "2016-01-05", "msg": "bye, bar"}
{ "name": "aaron", "date": "2016-01-15", "msg": "not foo"}
Run Code Online (Sandbox Code Playgroud)

但是我现在如何过滤这些结果?并且要非常清楚,我想在聚合选择最新的点击进行过滤top_hits,而不是之前。

谢谢你。

hos*_*adi 1

我有确切的问题。经过大量搜索后的结果是这样的:

如果您想根据数字指标过滤热门结果,您可以使用管道聚合,例如存储桶选择器。这种方式以某种方式在elasticsearch中实现SQL HAVING。对于这种情况,可以找到 在elasticsearch中实现HAVING的一个非常有用的答案

但是,如果您要过滤的指标不是数字,则无法(至少在 v 6.2.4 之前)在 elasticsearch 端执行此操作。

在这种情况下,正如 @ismail 所说,您需要通过软件在客户端执行此操作。