如何在嵌套文档上聚合每个存储桶的子存储桶

时间:2014-05-13 09:12:16

标签: elasticsearch

完整的示例代码:

https://gist.github.com/anonymous/329eaaf5654096c529da

对于标准电子商务网站,我有一个简单的标准产品/选项映射:

"mappings": {
        "product": {
            "properties" : {
                "name":
                {
                    "type": "string",
                    "fields": {
                        "raw":   { "type": "string", "analyzer": "lowercase" }
                    },
                    "analyzer": "default"

                },
                "options" : {
                    "type": "nested",
                    "properties": {
                        "id": {"type": "integer"}, 
                        "name": {"type": "string"},
                        "values": {"type": "nested"}
                    }
                },
                "price":{"type": "integer"},
                "createdAt": {
                    "type": "date",
                    "format": "basic_date_time"
                }
            }
        }
    }

请注意,1个产品有多个选项,每个选项可以有多个值(即:衬衫,选项颜色包括蓝色,红色;选项尺寸包括M,XL)

目前,在使用多个条件搜索产品的查询之后,我汇总结果以获取结果集中所有选项和选项值的列表:

"aggregations": {
      "options": {
         "nested": {
            "path": "options"
         },
         "aggs": {
            "options_ids": {
               "terms": {
                  "field": "id"
               }
            },
            "aggs": {
               "nested": {
                  "path": "options.values"
               },
               "aggs": {
                  "options_values_ids": {
                     "terms": {
                        "field": "options.values.id"
                     }
                  }
               }
            }
         }
      }
}

一切顺利,除非我得到类似的东西

"aggregations": {     
      "options": {
         "doc_count": 4,
         "options_ids": {
            "buckets": [
               {
                  "key": 1,
                  "doc_count": 2
               },
               {
                  "key": 2,
                  "doc_count": 2
               }
            ]
         },
         "aggs": {
            "doc_count": 7,
            "options_values_ids": {
               "buckets": [
                  {
                     "key": 1,
                     "doc_count": 2
                  },
                  {
                     "key": 5,
                     "doc_count": 2
                  },
                  {
                     "key": 2,
                     "doc_count": 1
                  },
                  {
                     "key": 3,
                     "doc_count": 1
                  },
                  {
                     "key": 6,
                     "doc_count": 1
                  }
               ]
            }
         }
      }
   }

如您所见,我无法知道哪些选项值属于结果中的哪些选项。如果可以在每个选项下列出可用的选项值,那将会好得多。这有可能吗?

1 个答案:

答案 0 :(得分:1)

您需要嵌套聚合:

"aggregations": {
   "options" : {
      "aggs" : {
         "options_ids" : {
            "aggs" : {
               "aggs" : {
                  "options_values_ids" : {
                     "terms" : {
                        "field" : "options.values.id"
                     }
                  }
               },
               "nested" : {
                  "path" : "options.values"
               }
            },
            "terms" : {
               "field" : "id"
            }
         }
      },
      "nested" : {
         "path" : "options"
      }
   }
}