2017-09-28 8 views
0

私はelasticsearchクエリを使用してクエリ結果から集計を取得しています。集約は正常に動作します。なぜなら、私は色が黄金である「女性のファッション」カテゴリからすべてのドレスを取得することを選択するからです。elasticsearchクエリから1つのフィルタを避けてすべての集計を取得する方法

集計は、金色だけを返すため、正常に動作しています。しかし論理的には、その集約のすべての色が必要です。

フロントエンドフィルタでは、集計リクエストのレコードを直接表示しています。今すぐフロントエンドで誰かが "ゴールデン"カラーを選択すると、それはドリルダウンして他のカラーフィルターをすべて削除し、ゴールデンカラーのみを表示します。

すべての結果を表示するために、何らかの理由で集計から色を避ける必要があります。

{ 
    "size": 15, 
    "from": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [{ 
         "match": { 
          "category": "women_fashion" 
         } 
        }, { 
         "nested": { 
          "path": "variations", 
          "query": { 
           "bool": { 
            "must": [{ 
             "match": { 
              "variations.color": "golden" 
             } 
            }] 
           } 
          } 
         } 
        }], 
        "should": null 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "brands": { 
      "terms": { 
       "size": 10, 
       "field": "brand" 
      } 
     }, 
     "min_price": { 
      "min": { 
       "field": "price" 
      } 
     }, 
     "max_price": { 
      "max": { 
       "field": "price" 
      } 
     }, 
     "variations": { 
      "nested": { 
       "path": "variations" 
      }, 
      "aggs": { 
       "size": { 
        "terms": { 
         "size": 100, 
         "field": "variations.size" 
        } 
       }, 
       "color": { 
        "terms": { 
         "size": 100, 
         "field": "variations.color" 
        } 
       }, 
       "waist_size": { 
        "terms": { 
         "size": 100, 
         "field": "variations.waist_size" 
        } 
       } 
      } 
     } 
    } 
} 

マイマップ:

{ 
    "mappings": { 
     "products": { 
      "properties": { 
       "variations": { 
        "type": "nested" 
       } 
      } 
     } 
    } 
} 

サンプル文書:

{ 
    "title": "100% Cotton Unstitched Suit For Men", 
    "slug": "100-cotton-unstitched-suit-for-men", 
    "price": 200, 
    "sale_price": 0, 
    "vendor_id": 32, 
    "featured": 0, 
    "viewed": 20, 
    "stock": 4, 
    "sku": "XXX-B", 
    "rating": 0, 
    "active": 1, 
    "vendor_name": "vendor_name", 
    "category": [ 
     "men_fashion", 
     "traditional_clothing", 
     "unstitched_fabric" 
    ], 
    "image": "imagename.jpg", 
    "variations": [ 
     { 
      "variation_id": "34", 
      "stock": 5, 
      "price": 200, 
      "variation_image": "", 
      "sku": "XXX-C", 
      "size": "m", 
      "color": "red" 
     }, 
     { 
      "variation_id": "35", 
      "stock": 5, 
      "price": 200, 
      "variation_image": "", 
      "sku": "XXX-D", 
      "size": "l", 
      "color": "red" 
     } 
    ] 
} 

にたくさんの文書を通過した後、そのポストフィルタと呼ばれるものがあります何とかこの問題を解決することができます。私はそれを使用しようとしましたが、少し複雑です。誰にもこれに関する過去の経験はありますか?グローバルaggrgationsと


MY更新クエリ: 私はグローバルな集計を使用して試してみましたが、それは今、私はそのカテゴリの製品に関連したブランドを示したいとelasticsearch内のすべてのブランドを、示しています。 https://www.elastic.co/guide/en/elasticsearch/guide/current/_scoping_aggregations.html#_global_bucketから

{ 
    "size": 15, 
    "from": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [{ 
         "match": { 
          "category": "women_fashion" 
         } 
        }, { 
         "nested": { 
          "path": "variations", 
          "query": { 
           "bool": { 
            "must": [{ 
             "match": { 
              "variations.color": "golden" 
             } 
            }] 
           } 
          } 
         } 
        }], 
        "should": null 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "all_brands" : { 
      "global" : {}, 
      "aggs" : { 
       "brands": { 
        "terms": { 
         "size": 10, 
         "field": "brand" 
        } 
       } 
      } 
     }, 
     "brands": { 
      "terms": { 
       "size": 10, 
       "field": "brand" 
      } 
     }, 
     "min_price": { 
      "min": { 
       "field": "price" 
      } 
     }, 
     "max_price": { 
      "max": { 
       "field": "price" 
      } 
     }, 
     "variations": { 
      "nested": { 
       "path": "variations" 
      }, 
      "aggs": { 
       "size": { 
        "terms": { 
         "size": 100, 
         "field": "variations.size" 
        } 
       }, 
       "color": { 
        "terms": { 
         "size": 100, 
         "field": "variations.color" 
        } 
       }, 
       "waist_size": { 
        "terms": { 
         "size": 100, 
         "field": "variations.waist_size" 
        } 
       } 
      } 
     } 
    } 
} 

答えて

0

:凝集の

使用"global" : {}は、仕事をするようです。

フィルタ集約が必要な場合は、https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.htmlを使用してください。

+0

あなたの答えは@thomasに感謝します。しかし、グローバルアグリゲーションを使用すると、すべての結果が得られます。私は使用しているクエリで自分のコードを更新しました –

+0

次に、https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregationで集約をフィルタリングできます.html。 –

関連する問題