2017-08-22 22 views
0

フィルタリングされた2レベルのネストされたオブジェクトから最小値と最大値を取得する方法を探しています。だから、下のcurrencyCode GBPの最小値と最大値を取得しようとしています。各製品は、複数のSKUを持つことができ、(1つだけがGBPになりますが)各SKUは、複数の価格を持つことができます。ElasticSearch - ネストされたフィルタリング集計

"hits": [ 
     { 
     "_index": "product", 
     "_type": "main", 
     "_id": "1", 
     "_score": 1, 
     "_source": {   
      "skus": [ 
      { 
       "prices": [ 
       { 
        "currencyCode": "GBP", 
        "price": 15 
       } 
       ] 
      } 
      ] 
     } 
     },{ 
     "_index": "product", 
     "_type": "main", 
     "_id": "2", 
     "_score": 1, 
     "_source": {   
      "skus": [ 
      { 
       "prices": [ 
       { 
        "currencyCode": "GBP", 
        "price": 20 
       } 
       ] 
      } 
      ] 
     } 
     }, 
    { 
     "_index": "product", 
     "_type": "main", 
     "_id": "3", 
     "_score": 1, 
     "_source": {   
      "skus": [ 
      { 
       "prices": [ 
       { 
        "currencyCode": "GBP", 
        "price": 25 
       } 
       ] 
      } 
      ] 
     } 
     }] 
    } 

だから私は15分、最大25をしたい私はFilter AggregationNested Aggregationに見てきたが、来ることができません答えと一緒に。

私はElasticSearchバージョン5.5を使用しています。

Nest .netに変換する前に、正しくクエリを実行しようとしています。

ご協力いただければ幸いです。

答えて

1

あなたが巣を「入れ子になった」と「フィルタ」の集計、このようなことができます。

{ 
    "size": 0, 
    "aggs": { 
    "skus": { 
     "nested": { 
     "path": "skus" 
     }, 
     "aggs": { 
     "prices": { 
      "nested": { 
      "path": "skus.prices" 
      }, 
      "aggs": { 
      "gbp_filter": { 
       "filter": { 
       "term": { 
        "skus.prices.currencyCode": "GBP" 
       } 
       }, 
       "aggs": { 
       "min_price": { 
        "min": { 
        "field": "skus.prices.price" 
        } 
       }, 
       "max_price": { 
        "max": { 
        "field": "skus.prices.price" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

あなたが唯一の価格はGBPことができると言うので、それはすべてのSKUのために、そこだけできることも事実であります1通貨あたり1つの価格ですか?その場合、ここでは価格にネストされたデータ型を使用しないことをお勧めします。代わりに、あなたはこのようなマッピング何かを使用することができます。

{ 
    "product": { 
    "properties": { 
     "skus": { 
     "type": "nested", 
     "properties": { 
      "prices": { 
      "properties": { 
       "GBP": {"properties": {"price": {"type": "integer"}}}, 
       "USD": {"properties": {"price": {"type": "integer"}}}, 
       ...remaining currencies... 
      } 
      } 
     } 
     } 
    } 
    } 
} 

マッピングは非常に簡潔ではありませんが、照会する方が効率的になり、そしてクエリがよりよいです。 (ほとんどの場合)いつでもネストを取り除くためにデータを非正規化することができます。異なるタイプのクエリのニーズを満たすために情報を複製する必要がある場合でも、それは良い考えです。

+0

ありがとうございます。私も最初の巣を取り除くことができたので、価格の巣から始めましょう。あなたのスキーマも同様ですが、動的に追加するには価格が必要です。とても有難い! – BenG

関連する問題