有没有办法在Elasticsearch中同时对所有产品进行查询聚合?

pprl5pva  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(254)

我想创建一个包含每种产品的日需求的pandas Dataframe 。我尝试了下面的代码,它只提供了我想要的product_id=1的数据。是否有一种简单的方法可以对所有产品循环此 Dataframe ?

search_body_statistics = {
    "size": 0,
    "query": {
        "bool": {
            "must": {
                "match": {
                    "product_id": "1"
                }
            }
        }
    },
    "aggs": {
        "countPerDay": {
            "terms": {
                "field": "day",
                "size": 10000,
                "order": {
                    "_key": "asc"
                }
            }
        }
    }
}
result_stat = es.search(index="sales", body=search_body_statistics)
print(result_stat)

dfProductDay = json_normalize(result_stat['aggregations']['countPerDay']['buckets'])
dfProductDay.rename(columns={'key': 'day'}, inplace=True)
print(dfProductDay)
js81xvg6

js81xvg61#

Tldr;

我认为您正在寻找子聚合。
存储桶聚合支持bucketmetric子聚合。例如,具有avg子聚合的terms聚合将计算文档的每个存储桶的平均值。
另外,我注意到您正在day上使用terms聚合,也许您愿意考虑使用histogram aggregation

溶液

我相信下面的查询对您有用。

search_body_statistics = {
  "size": 0
  "aggs": {
    "PerDay": {
      "terms": {
        "field": "day",
        "size": 10000,
        "order": {
          "_key": "asc"
        }
      },
      "aggs": {
        "ProductCount": {
          "terms": {
            "field": "product_id"
          }
        }
      }
    }
  }
}

相关问题