【问题标题】:How do I aggregate over top_hits results in elasticsearch如何在弹性搜索中聚合 top_hits 结果
【发布时间】:2016-04-01 06:56:54
【问题描述】:

以下是示例文档:

{
    "player": "Jim",
    "score" : 5
    "timestamp": 1459492890000
}

{
    "player": "Jim",
    "score" : 7
    "timestamp": 1459492895000
}

{
    "player": "Dave",
    "score" : 9
    "timestamp": 1459492894000
}

{
    "player": "Dave",
    "score" : 4
    "timestamp": 1459492898000
}

我想获取每个玩家的最新分数,然后获取所有这些分数的平均值。所以答案是 5.5。 Jim 的最新分数是 7,Dave 的最新分数是 4。两者之间的平均值是 5.5

我发现获取玩家“最新”文档的唯一方法是使用 top_hits 聚合。但是,我似乎无法在获得最新文档后进行另一次聚合。

这是我想出的最好的:

{
  "aggs": {
    "last_score": {
      "terms": { "field": "player" },
      "aggs": {
        "last_score_hits": {
          "top_hits": {
            "sort": [ { "timestamp": { "order": "desc" } } ],
            "size": 1
          },
          "aggs": {
            "avg_score": {
              "avg": { "field": "score" }
            }
          }
        }
      }
    }
  }
}

但是,这给了我这个错误:

类型为 [top_hits] 的聚合器 [last_score_hits] 无法接受 子聚合

如果还有另一种方法可以在不使用 top_hits 的情况下完成此搜索,那么我会全力以赴。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您正在尝试将avg_score 作为last_score_hits 的子聚合。 要获得成功,您必须将avg_score 作为last_score 的子聚合。请参阅下面的示例:

    {
      "aggs": {
        "last_score": {
          "terms": {
            "field": "player"
          },
          "aggs": {
            "last_score_hits": {
              "top_hits": {
                "sort": [
                  {
                    "timestamp": {
                      "order": "desc"
                    }
                  }
                ],
                "size": 1
              }
            },
            "avg_score": {
              "avg": {
                "field": "score"
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 我认为这不是 OP 想要的。
    【解决方案2】:

    您可以在 top_hit 的并行级别上拥有其他聚合,但不能在 top_hit 之下拥有任何 sub_aggregation。 ElasticSearch 不支持它。 here is the link to Github issue

    您可以有一个并行级别的聚合,例如:

    "aggs": {
        "top_hits_agg": {
            "top_hits": {
                "size": 10,
                "_source": {
                  "includes": ["score"]
                }
            }
        },
        "avg_agg": {
            "avg": {
                "field": "score"
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多