2017-08-22 4 views
0

Je cherche un moyen d'obtenir la valeur min et max d'un objet imbriqué à 2 niveaux qui a été filtré. Donc ci-dessous im essayant d'obtenir le prix min et max qui a un currencyCode GBP. Chaque produit peut avoir plusieurs numéros de référence et chaque sku peut avoir plusieurs prix (mais seulement 1 sera GBP):ElasticSearch - Agrégations filtrées imbriquées

"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 
       } 
       ] 
      } 
      ] 
     } 
     }] 
    } 

Je veux min 15, max 25. J'ai regardé dans Filter Aggregation et Nested Aggregation mais ne peut pas venir avec la réponse. J'utilise la version 5.5 de ElasticSearch.

J'essaye de faire fonctionner la requête correctement avant de convertir en Nest .net.

Toute aide serait grandement appréciée.

Répondre

1

Vous pouvez imbriquer « emboîtés » et « filtre » agrégations, comme celui-ci:

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

Cependant, puisque vous dites qu'un seul prix peut être GBP, est-il vrai aussi que pour chaque SKU, il ne peut être un prix par devise? Si tel est le cas, je suggère de ne pas utiliser le type de données imbriqué pour les prix ici. Au lieu de cela, vous pouvez utiliser une chose de cartographie comme ceci:

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

La cartographie est pas très concise, mais il sera plus efficace pour interroger, et les requêtes sont plus agréables. (Presque) chaque fois que vous pouvez dénormaliser vos données pour vous débarrasser de l'imbrication, même si vous devez dupliquer des informations (afin de répondre aux besoins de différents types de requêtes), c'est une bonne idée.

+0

Merci beaucoup. J'ai aussi été capable de retirer le premier nid, alors commencez au nid de prix. Votre schéma fait aussi sembler mais j'ai besoin de prix à ajouter dynamiquement. très appréciée! – BenG