我有以下记录,记录了不同城市中不同品牌的汽车销量。

文件-1

{
"city": "Delhi",
"cars":[{
  "name":"Toyota",
  "purchase":100,
  "sold":80
},{
  "name":"Honda",
  "purchase":200,
  "sold":150
}]
}

文件-2
{
"city": "Delhi",
"cars":[{
  "name":"Toyota",
  "purchase":50,
  "sold":40
},{
  "name":"Honda",
  "purchase":150,
  "sold":120
}]
}

我试图提出查询以汇总给定城市的汽车统计信息,但没有得到正确的查询。

所需结果:
{
"city": "Delhi",
"cars":[{
  "name":"Toyota",
  "purchase":150,
  "sold":120
},{
  "name":"Honda",
  "purchase":350,
  "sold":270
}]
}

最佳答案

首先,您需要将您的数组映射为一个嵌套字段(脚本会很复杂并且性能不佳)。嵌套字段被索引,聚合将非常快。

删除您的索引/或创建一个新索引。请注意,我使用test作为类型。

{
  "mappings": {
    "test": {
      "properties": {
        "city": {
          "type": "keyword"
        },
        "cars": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "keyword"
            },
            "purchase": {
              "type": "integer"
            },
            "sold": {
              "type": "integer"
            }
          }
        }
      }
    }
  }
}

为您的文档编制索引(方法与之相同)

对于聚合:
{
  "size": 0,
  "aggs": {
    "avg_grade": {
      "terms": {
        "field": "city"
      },
      "aggs": {
        "resellers": {
          "nested": {
            "path": "cars"
          },
          "aggs": {
            "agg_name": {
              "terms": {
                "field": "cars.name"
              },
              "aggs": {
                "avg_pur": {
                  "sum": {
                    "field": "cars.purchase"
                  }
                },
                "avg_sold": {
                  "sum": {
                    "field": "cars.sold"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

结果:
buckets": [
{
"key": "Honda",
"doc_count": 2,
"avg_pur": {
"value": 350
},
"avg_sold": {
"value": 270
}
}
,
{
"key": "Toyota",
"doc_count": 2,
"avg_pur": {
"value": 150
},
"avg_sold": {
"value": 120
}
}
]

如果您将名称/城市字段索引为文本(必须先询问是否必要),则在术语聚合(“cars.name.keyword”)中使用.keyword。

10-01 16:58
查看更多