【问题标题】:ElasticSearch: Sort Aggregations by Filtered AverageElasticSearch:按过滤平均值对聚合进行排序
【发布时间】:2019-08-08 21:19:50
【问题描述】:

我有一个 ElasticSearch 索引,其文档结构如下:

"created": "2019-07-31T22:44:41.437Z",
"id": "2956",
"rating": 1

如果我希望创建一个按平均评分排序的 id 字段的聚合,可以通过以下方式处理:

{
  "aggs" : {
    "sorted" : {
      "terms" : {
        "field" : "id",
        "order" : { "sort" : "asc" }
      },
      "aggs" : {
        "sort" : {
          "avg" : {
            "field" : "rating"
          }
        }
      }
    }
  }
}

但是,我只考虑上周内具有 created 值的文档(然后取这些 rating 字段的平均值)。

我对此的幼稚想法是在 sort 聚合中应用过滤器或范围,但聚合不能有多种类型,并且查看 avg documentation,我看不到将其放入的方法平均乐观地尝试将范围字段放在 avg 中,不管文档说什么都没有产生任何结果(如预期的那样)。

我将如何实现这一目标?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    尝试使用范围查询向正文添加布尔查询:

    {
       query:
          bool: {
             must: {
                 "range": {
                     "created_time": {
                        "gte": one_week_ago,
                     }
                 }
             }
         }
    },
    {
      "aggs" : {
        "sorted" : {
          "terms" : {
            "field" : "id",
            "order" : { "sort" : "asc" }
          },
          "aggs" : {
            "sort" : {
              "avg" : {
                "field" : "rating"
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 当然……这很有意义。出于某种原因,我试图在 aggs 中处理这一切。谢谢。
    【解决方案2】:

    您可以像这样查询动态日期 正如汤姆所说,但使用“now-7d/d”

    {
       query:
          bool: {
             must: {
                 "range": {
                     "created_time": {
                        "gte": "now-7d/d"
                     }
                 }
             }
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-18
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 2016-04-12
      相关资源
      最近更新 更多