2016-05-06 8 views
1

Mit Elasticsearch 2, ist es möglich, eine Aggregation zurückgeben, wo eine Dokumentkategorie einen bestimmten Feldwert entspricht? Zum Beispiel möchte ich alle Kategorien bekommen, in denen categories.type = "application".Elasticsearch - Aggregation zurückgeben, um einem bestimmten Wert zu entsprechen?

Meine Abbildung sieht wie folgt aus:

"mappings": { 
    "products": { 
     "_all": { 
      "enabled": true 
     }, 
     "properties": { 
      "title": { 
       "type": "string" 
      }, 
      "categories": { 
       "type":"nested", 
       "properties": { 
        "type": { 
         "type": "string", 
         "index": "not_analyzed" 
        }, 
        "name": { 
         "type": "string", 
         "index": "not_analyzed" 
        } 
       } 
      } 
     } 
    } 
} 

Meine Abfrage sieht wie folgt aus, die alle Kategorietypen gibt, aber ich will nur diejenigen, wo categories.type = „application“ filtern.

{ 
    "query":{ 
     "multi_match": { 
      "query": "Sound", 
      "fields": [ 
       "title" 
      ] 
     } 
    }, 
    "aggs":{ 
     "Applications": { 
      "nested": { 
       "path": "categories" 
      }, 
      "aggs": { 
       "meta": { 
        "terms": { 
         "field": "categories.type" 
        }, 
        "aggs": { 
         "name": { 
          "terms": { 
           "field": "categories.name" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Antwort

2

Sie können aggregation filter verwenden, wenn ich das richtig verstehe:

{ 
    size : 50, 
    "query":{ 
     "multi_match": { 
      "query": "Sound", 
      "fields": [ 
       "title" 
      ] 
     } 
    }, 
    "aggs":{ 
     "Applications": { 
      "nested": { 
       "path": "categories" 
      }, 
      "aggs": { 
       "meta": { 
        "filter" : { 
         "term" : { 
          "categories.type" : "application" 
         } 
        }, 
        "aggs": { 
         "name": { 
          "terms": { 
           "field": "categories.name" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Hoffe, dass Helpes.

+0

Gibt es eine Möglichkeit, boolesche Logik der Aggregation hinzuzufügen, so etwas wie categories.type = "Anwendung "oder" Sensoren "? – Redtopia

+2

Ja. Sie können Bool-Filter verwenden. Filterteil wie folgt ändern: "filter": {"bool": {"sollte": [{"term": {"categories.type": "application"}}, {"term": {"categories.type": "Sensor"}}]}} – alpert

+0

Wissen Sie, wie ich einen Größenparameter für diese Aggregation angeben kann? Es ist standardmäßig 10, aber ich möchte 50 von ihnen bekommen. – Redtopia

1

Sie müssen nur ersetzen "include": "include" "*.": "Anwendung"

{ 
    "query":{ 
     "multi_match": { 
      "query": "Sound", 
      "fields": [ 
       "title" 
      ] 
     } 
    }, 
    "aggs":{ 
     "Applications": { 
      "nested": { 
       "path": "categories" 
      }, 
      "aggs": { 
       "meta": { 
        "terms": { 
         "field": "categories.type" 
         , "include": "application" 
        }, 
        "aggs": { 
         "name": { 
          "terms": { 
           "field": "categories.name" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

Ich möchte nicht nur Dokumente mit einem Anwendungskategorietyp übereinstimmen. Ich möchte Kategorien zusammenfassen, die einem bestimmten Kategorietyp aus den übereinstimmenden Dokumenten entsprechen. – Redtopia

+0

Ich verstehe. Ich habe die Antwort geändert. Sie müssen nur ersetzen ** "include": ". *" ** mit ** "include": "application" ** – pkhlop

Verwandte Themen