2017-03-24 3 views
1

私はESマッピングで親子関係を持っています。子のアグリゲーション(avg)の値で親をフィルタリングしたいと思います。つまり、私はその値が与えられた範囲内にある親だけを検索したい。Elasticsearchの子アグリゲーションによるフィルタ親

私はaggsとpost-filtersでやってみましたが、動作させることができませんでした。

{ 
    "apartments" : { 
    "mappings" : { 
     "apartment_availability" : { 
     "_parent" : { 
      "type" : "apartment" 
     }, 
     "_routing" : { 
      "required" : true 
     }, 
     "properties" : { 
      "availability_date" : { 
      "type" : "date" 
      }, 
      "apartment_id" : { 
      "type" : "long" 
      }, 
      "id" : { 
      "type" : "long" 
      }, 
      "price_cents" : { 
      "type" : "long" 
      }, 
      "status" : { 
      "type" : "text", 
      "fields" : { 
       "keyword" : { 
       "type" : "keyword", 
       "ignore_above" : 256 
       } 
      } 
      } 
     } 
     }, 
     "apartment" : { 
     "properties" : { 
      "id" : { 
      "type" : "long" 
      }, 
     } 
     } 
    } 
    } 
} 

ORUユーザーは3月24〜3月31日と€150-€300の価格帯の期間を選択した場合は、その後、我々は彼らにその期間中に無料ですべてのアパートを見せたいと、平均価格、そのために期間は€150〜€300の範囲です。

は、ここでは、これまで持っているものです。

{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must": [{ 
      "has_child": { 
       "type": "apartment_availability", 
       "min_children": 8, 
       "max_children": 8, 
       "query": { 
       "bool": { 
        "must": [{ 
        "term": { 
         "status": "available" 
        } 
        }, { 
        "range": { 
         "availability_date": { 
         "gte": "2017-03-24", 
         "lte": "2017-03-31" 
         } 
        } 
        }] 
       } 
       } 
      } 
      }] 
     } 
     } 
    } 
    } 
} 

答えて

0

私の提案、アパートのどちらかを選択するbucket_selector集約を使用して:

GET /apartments/apartment/_search 
{ 
    "query": { 
    "bool": { 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "has_child": { 
       "type": "apartment_availability", 
       "query": { 
        "bool": { 
        "must": [ 
         { 
         "term": { 
          "status": "available" 
         } 
         }, 
         { 
         "range": { 
          "availability_date": { 
          "gte": "2017-04-01", 
          "lte": "2017-04-03" 
          } 
         } 
         } 
        ] 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "apartments_ids": { 
     "terms": { 
     "field": "id", 
     "size": 10 
     }, 
     "aggs": { 
     "avails": { 
      "children": { 
      "type": "apartment_availability" 
      }, 
      "aggs": { 
      "filter_avails": { 
       "filter": { 
       "bool": { 
        "must": [ 
        { 
         "term": { 
         "status": "available" 
         } 
        }, 
        { 
         "range": { 
         "availability_date": { 
          "gte": "2017-04-01", 
          "lte": "2017-04-03" 
         } 
         } 
        } 
        ] 
       } 
       }, 
       "aggs": { 
       "average": { 
        "avg": { 
        "field": "price_cents" 
        } 
       } 
       } 
      } 
      } 
     }, 
     "avg_bucket_filter": { 
      "bucket_selector": { 
      "buckets_path": { 
       "avg": "avails>filter_avails.average" 
      }, 
      "script": "params.avg > 150 && params.avg < 300" 
      } 
     } 
     } 
    } 
    } 
} 
関連する問題