Elasticsearch Aggregations:使用嵌套查询过滤全局聚合

时间:2019-01-25 13:15:27

标签: elasticsearch elasticsearch-aggregation

我有这样的“嵌套”映射:

"stringAttributes":{
   "type":"nested",
   "properties":{
      "Name":{
         "type":"keyword"
      },
      "Value":{
         "type":"keyword"
      }
   }
},

,因此具有以下文档:

stringAttributes:[
   {
      Name:"supplier",
      Value:"boohoo"
   },
   {
      Name:"brand",
      Value:"gucci"
   },
   {
      Name:"primaryColour",
      Value:"black"
   },
   {
      Name:"secondaryColour",
      Value:"green"
   },
   {
      Name:"size",
      Value:"12"
   }
]

在构建多面搜索时,我相信我需要进行全局汇总。即当用户筛选供应商时,结果集将不包含其他供应商提供的文档,因此常规聚合将不包含任何其他供应商。

查询中可以包含以下子句:

"must": [
  {
    "nested": {
      "path": "stringAttributes",
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "stringAttributes.Name": "supplier"
              }
            },
            {
              "terms": {
                "stringAttributes.Value": [
                  "boohoo"
                ]
              }
            }
          ]
        }
      }
    }
  },
  {
    "nested": {
      "path": "stringAttributes",
      "query": {
        "bool": {
          "must": [
            {
              "term": {
                "stringAttributes.Name": "brand"
              }
            },
            {
              "terms": {
                "stringAttributes.Value": [
                  "warehouse"
                ]
              }
            }
          ]
        }
      }
    }
  }
]

因此,在这种情况下,我需要一个全局聚合,然后由应用的所有其他过滤器(例如,按品牌)过滤,这将返回可以根据这些其他过滤器进行选择的其他供应商。

这是我到目前为止所拥有的。但是,它返回“全局”未过滤的结果。在这一点上,我完全陷入了困境。

{
   "global":{},
   "aggs":{
      "inner":{
         "filter":{
            "nested":{
               "query":{
                  "bool":{
                     "filter":[
                        {
                           "term":{
                              "stringAttributes.Name":{
                                 "value":"brand"
                              }
                           }
                        },
                        {
                           "terms":{
                              "stringAttributes.Value":[
                                 "warehouse"
                              ]
                           }
                        }
                     ]
                  }
               },
               "path":"stringAttributes"
            }
         }
      },
      "aggs":{
         "nested":{
            "path":"stringAttributes"
         },
         "aggs":{
            "aggs":{
               "filter":{
                  "match":{
                     "stringAttributes.Name":"supplier"
                  }
               },
               "aggs":{
                  "facet_value":{
                     "terms":{
                        "size":1000,
                        "field":"stringAttributes.Value"
                     }
                  }
               }
            }
         }
      }
   }
}

关于使用嵌套属性过滤全局聚合的任何建议?我已经阅读了很多关于SO的各种其他答案的文档,但仍在努力理解为什么未过滤此特定agg。

1 个答案:

答案 0 :(得分:0)

更多挖掘后,我建议的答案...

{
   "global":{

   },
   "aggs":{
      "inner":{
         "filter":{
            "nested":{
               "query":{
                  "bool":{
                     "filter":[
                        {
                           "term":{
                              "stringAttributes.Name":{
                                 "value":"brand"
                              }
                           }
                        },
                        {
                           "terms":{
                              "stringAttributes.Value":[
                                 "warehouse"
                              ]
                           }
                        }
                     ]
                  }
               },
               "path":"stringAttributes"
            }
         },
         "aggs":{
            "nested":{
               "path":"stringAttributes"
            },
            "aggs":{
               "agg_filtered_special":{
                  "filter":{
                     "match":{
                        "stringAttributes.Name":"supplier"
                     }
                  },
                  "aggs":{
                     "facet_value":{
                        "terms":{
                           "size":1000,
                           "field":"stringAttributes.Value"
                        }
                     }
                  }
               }
            }
         }
      }
   }
}