在嵌套的热门点击聚合中包含父 _source 字段

Include parent _source fields in nested top hits aggregation

我正在尝试聚合字段并使用 top_ hits 获取最高记录,但我想在响应中包含嵌套 属性 映射中未包含的其他字段。目前,如果我指定 _source:{"include":[]},我只能获取当前嵌套 属性.

中的字段

这是我的映射

{
  "my_cart":{
    "mappings":{
      "properties":{
        "store":{
          "properties":{
            "name":{
              "type":"keyword"
            }
          }
        },
        "sales":{
          "type":"nested",
          "properties":{
            "Price":{
              "type":"float"
            },
            "Time":{
              "type":"date"
            },
            "product":{
              "properties":{
                "name":{
                  "type":"text",
                  "fields":{
                    "keyword":{
                      "type":"keyword"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
  

更新

Joe 的回答解决了我的上述问题。

我当前的回应问题是,虽然我得到的产品名称是“密钥”和其他详细信息,但我在账单收据中作为该交易的一部分的点击中也得到了其他产品名称。我想汇总产品名称并查找每个产品的最后销售日期以及其他详细信息,例如价格、数量等。

当前响应

"aggregations" : {
    "aggregate_by_most_sold_product" : {
      "doc_count" : 2878592,
      "all_products" : {
        "buckets" : [
          {
            "key" : "shampoo",
            "doc_count" : 1,
            "lastSold" : {
              "value" : 1.602569793E12,
              "value_as_string" : "2018-10-13T06:16:33.000Z"
            },
            "using_reverse_nested" : {
              "doc_count" : 1,
              "latest product" : {
                "hits" : {
                  "total" : {
                    "value" : 1,
                    "relation" : "eq"
                  },
                  "max_score" : 0.0,
                  "hits" : [
                    {
                      "_index" : "my_cart",
                      "_type" : "_doc",
                      "_id" : "36303258-9r7w-4b3e-ba3d-fhds7cfec7aa",
                      "_source" : {
                        "cashier" : {
                          "firstname" : "romeo",
                          "uuid" : "2828dhd-0911-7229-a4f8-8ab80dde86a6"
                        },
                       "product_price": {
                       "price":20,
                       "discount_offered":10
                        },

                        "sales" : [
                          {
                            "product" : {
                              "name" : "shampoo",
                               "time":"2018-10-13T04:44:26+00:00
                            },
                             "product" : {
                              "name" : "noodles",
                              "time":"2018-10-13T04:42:26+00:00
                            },
                              "product" : {
                              "name" : "biscuits",
                              "time":"2018-10-13T04:41:26+00:00
                            }
                            }
                            ]
                              }
                             }
                            ]
                             }
}
]


预期响应

它为我提供了增加存储桶大小的交易中的所有产品名称。我只想要单个产品名称、最后销售日期以及每个产品的其他详细信息。

我的聚合与乔在回答中的聚合相同

另外,我的疑问是我是否也可以添加脚本来对我在 _source 中获得的字段执行操作。

Ex:- price-discount_offered = 最终数量。

除非您使用 reverse_nested. In that case, however, you've lost the ability to only retrieve the applicable nested subdocument. But there is luckily a way to sort a terms aggregation by the result of a different, numeric one:

,否则 nested 上下文无法访问父级
GET my_cart/_search
{
  "size": 0,
  "aggs": {
    "aggregate": {
      "nested": {
        "path": "sales"
      },
      "aggs": {
        "all_products": {
          "terms": {
            "field": "sales.product.name.keyword",
            "size": 6500,
            "order": {                                <--
              "lowest_date": "asc"
            }
          },
          "aggs": {
            "lowest_date": {                          <--
              "min": {
                "field": "sales.Time"
              }
            },
            "using_reverse_nested": {
              "reverse_nested": {},                   <--
              "aggs": {
                "latest product": {
                  "top_hits": {
                    "_source": {
                      "includes": [
                        "store.name"
                      ]
                    },
                    "size": 1
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

需要注意的是,您不会在 top_hits 中获取 store.name -- 虽然我怀疑您可能已经在客户端做了一些 post-processing您可以在哪里组合这些条目:

"aggregate" : {
  ...
  "all_products" : {
    ...
    "buckets" : [
      {
        "key" : "myproduct",                     <--
        ...
        "using_reverse_nested" : {
          ...
          "latest product" : {
            "hits" : {
              ...
              "hits" : [
                {
                  ...
                  "_source" : {
                    "store" : {
                      "name" : "mystore"         <--
                    }
                  }
                }
              ]
            }
          }
        },
        "lowest_date" : {
          "value" : 1.4200704E12,
          "value_as_string" : "2015/01/01"       <--
        }
      }
    ]
  }
}