【问题标题】:Elasticsearch: filter top hits aggregationElasticsearch:过滤热门点击聚合
【发布时间】:2020-01-26 16:23:41
【问题描述】:

假设我有一个包含大量用户 cmets 的 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 聚合选择了最新点击后过滤,而不是之前。

谢谢。

【问题讨论】:

  • 您想从获得的热门点击中过滤掉什么?请更详细地解释您的用例。
  • 例如,我想说“为每个在 msg 中有 'foo' 的用户返回最新评论。”需要明确的是,如果我过滤了“foo”然后找到了最高点击量,那么用户 chris 将是 { "name": "chris", "date": "2016-01-01", "msg": "hi, foo"},这不是他的最新评论。
  • @cjbottaro 与我在这里遇到的完全相同的问题:stackoverflow.com/questions/51360616/… 一位顾问在我的公司经过,说弹性搜索 6.2 或更低版本提供的功能是不可能的。您必须创建一个自定义脚本来过滤热门点击或在客户端过滤它或在获得结果后在服务器端过滤它。这不是最好的解决方案,而是一个解决方案。

标签: elasticsearch


【解决方案1】:

我有确切的问题。经过一番搜索,结果是这样的:

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

但是,如果您要过滤的指标不是数字,则无法(至少在 v 6.2.4 之前)在弹性搜索方面这样做。

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

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多