嵌套字段上的ElasticSearch聚合,父标识为

时间:2017-07-19 09:53:37

标签: elasticsearch elasticsearch-aggregation

以下是我的文档结构

'Order': {
    u'properties': {
        u'order_id': {u'type': u'integer'},
        'Product': {
            u'properties': {
                u'product_id': {u'type': u'integer'},                
                u'product_category': {'type': 'text'},                
            },
            u'type': u'nested'
        }
    }
}

文档1

"Order": {
    "order_id": "1",
    "Product": [
        {
            "product_id": "1", 
            "product_category": "category_1"
        }, 
        {
            "product_id": "2", 
            "product_category": "category_2"
        },
        {
            "product_id": "3", 
            "product_category": "category_2"
        },
    ] 
}

文档2

"Order": {

    "order_id": "2",
    "Product": [
        {
            "product_id": "4", 
            "product_category": "category_1"
        }, 
        {
            "product_id": "1", 
            "product_category": "category_1"
        },
        {
            "product_id": "2", 
            "product_category": "category_2"
        },
    ] 
}

我想获得以下输出

"aggregations": {
    "Order": [
        {
            "order_id": "1"                
            "category_counts": [
                {
                    "category_1": 1
                },
                {
                    "category_2": 2
                },
            ]
        }, 
        {
            "order_id": "1"                
            "category_counts": [
                {
                    "category_1": 2
                },
                {
                    "category_2": 1
                },
            ]
        }, 
    ]
}

我尝试使用嵌套聚合

"aggs": {
    "Product-nested": {
        "nested": {
            "path": "Product"
        }
        "aggs": {
            "category_counts": {
                "terms": {
                    "field": "Product.product_category"
                }
            }
        }, 
    }
}

它不为每个订单提供输出,但为所有订单提供组合输出

{
    "Product-nested": {
        "category_counts": [
            "category_1": 3,
            "category_2": 3
        ]
    }
}

我有两个问题:

  • 如何在上述场景中获得所需的输出?
  • 如果不是单个product_category,我有一个数组 product_categories那么我们将如何在此实现同样的目标 场景?

我使用的是elasticsearch> = 5.0

1 个答案:

答案 0 :(得分:0)

我有一个想法,但我不认为它是最好的..

您可以在“order_id”字段上进行术语聚合,然后在“Product.product_category”上进行子nestes聚合。

这样的事情:

{

“aggs”:{

"all-order-id": {
  "terms": {
    "field": "order_id",
    "size": 10
  },
  "aggs": {
    "Product-nested": {
      "nested": {
        "path": "Product"
      },
      "aggs": {
        "all-products-in-order-id": {
          "terms": {
            "field": "Product.product_category"
          }
        }
      }
    }
  }
}

} }

抱歉它的锁定位置凌乱,我对这个答案编辑器不太好。