Elasticsearch:过滤器顶部命中聚合

时间:2016-04-13 01:44:16

标签: 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"}

首先,我想为每个用户找到最新评论。我可以使用top_hits聚合:

来做到这一点
"aggs": {
    "name": {
      "terms": { "field": "name" },
      "aggs": {
        "latest_comment": {
          "top_hits": {
            "sort": [ {"date": { "order": "desc" } } ],
            "size": 1
            }
          }
        }
      }
    }
  }

这实际上给了我以下内容:

{ "name": "chris", "date": "2016-01-05", "msg": "bye, bar"}
{ "name": "aaron", "date": "2016-01-15", "msg": "not foo"}

但是我现在如何过滤这些结果?并且要非常清楚,我希望在之后过滤 top_hits聚合已经选择了最新的匹配,而不是之前。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

如果您要根据数字指标过滤匹配结果最高的结果,则可以使用管道聚合,例如存储桶选择器。这种方式可以在Elasticsearch中实现SQL HAVING。对于这种情况,非常有用的答案可以找到implementing HAVING in elasticsearch

但是,如果您要过滤的指标不是数字,则没有办法(至少到v 6.2.4之前)在Elasticsearch方面执行此操作。

在这种情况下,如@ismail所说,您需要在客户端使用软件来完成此操作。