elasticsearch - 需要对文档内部数组对象进行聚合 - ElasticSearch
问题描述
我正在尝试对以下文档进行聚合
{
"pid": 900000,
"mid": 9000,
"cid": 90,
"bid": 1000,
"gmv": 1000000,
"vol": 200,
"data": [
{
"date": "25-11-2018",
"gmv": 100000,
"vol": 20
},
{
"date": "24-11-2018",
"gmv": 100000,
"vol": 20
},
{
"date": "23-11-2018",
"gmv": 100000,
"vol": 20
}
]
}
这里需要做的分析是:
- 过滤所有文档的 mid 或/和 cid
- 过滤过去 7 天的 data.date 范围,并在该范围内为每个 pid 求和 data.vol
- 将文档按上一步中获得的总和按 desc 顺序排序
- 按 pid 对这些结果进行分组。
这意味着我们正在尝试通过特定 cid/mid 的日期范围内的销量(销售数量)总和来获得顶级产品。
这里PID是产品ID,MID是商家ID,CID是品类ID
解决方案
首先,您需要更改映射以在嵌套字段上运行查询。将字段“ data
”的类型更改为“嵌套”。
然后,您可以使用过滤器中的范围查询以及术语过滤器mid/cid
来过滤数据。获得正确的数据集后,您可以pid
在 sum of 上的以下子聚合上进行聚合vol
。
这是以下查询。
{
"query": {
"bool": {
"filter": [
{
"bool": {
"must": [
{
"range": {
"data.date": {
"gte": "28-11-2018",
"lte": "25-11-2018"
}
}
},
{
"must": [
{
"terms": {
"mid": [
"9000"
]
}
}
]
}
]
}
}
]
}
},
"aggs": {
"AGG_PID": {
"terms": {
"field": "pid",
"size": 0,
"order": {
"TOTAL_SUM": "desc"
},
"min_doc_count": 1
},
"aggs": {
"TOTAL_SUM": {
"sum": {
"field": "data.vol"
}
}
}
}
}
}
您可以相应地修改查询。希望这会有所帮助。
推荐阅读
- c++ - 在 main() 之前运行的代码中注册文件处理程序
- python - 而不是 Windows 上的 opencv_createsamples(OpenCV 4.0 及更高版本)?
- python - 将深度嵌套的 JSON 转换为基于 JSON 的多索引分层索引的 Pandas Dataframe
- r - 内存分配错误尝试使用带有 R 的 eurostat 包创建地图
- python - 有谁知道为什么我在使用 Python(Locust)打开 JSON 文件时在 Jenkins 中收到文件未找到错误?
- python - 迁移学习准确性的令人困惑的结果
- java - 安全地获取 java.lang.reflect.Method
- django - Django unittest on_delete CASCADE
- php - 在php中显示仅满足此条件的数组
- java - com.mysql.cj.jdbc.exceptions.CommunicationsException:JPA 项目中的通信链路故障