Elasticsearch Aggregations: фильтрация глобальной агрегации с помощью вложенных запросов - PullRequest
0 голосов
/ 25 января 2019

У меня есть «вложенное» отображение, например, так:

"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 голосов
/ 25 января 2019

Мой предложенный ответ после еще нескольких копаний ...

{
   "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"
                        }
                     }
                  }
               }
            }
         }
      }
   }
}
...