2017-02-10 6 views
0

elasticsearch 5.2Elasticsearch 5 | filter verschachteltes Objekt und verschachtelte Aggregationszählung

Ich möchte meine Elemente durch das verschachtelte Objekt state.id = 101 und eine Aggregationszählung für alle Elemente nach state.id filtern. Es gibt Elemente mit den Status-IDs 101, 102 und 103.

Die Aggregationszählung ist jetzt auf state.id 101 beschränkt. Ich möchte nur die Elemente mit state.id = 101 und die Aggregationszählung für alle Zustands-IDs abrufen .

Wie kann ich das tun?

GET index/items/_search 
{ 
    "query": { 
     "nested" : { 
      "path" : "state", 
      "query": { 
       "bool": { 
       "filter": { 
        "term": { "state.id": 101 } 
       } 
       } 
      } 
     } 
    }, 
    "aggs" : { 
     "state" : { 
      "nested" : { 
       "path" : "state" 
      }, 
      "aggs" : { 
       "count" : { "terms" : { "field" : "state.id" } } 
      } 
     } 
    } 
} 

Antwort

1

Sie müssen post_filter statt Abfrage verwenden: (Oh und verwenden POST anstelle von GET, wenn eine Nutzlast Senden)

POST index/items/_search 
{ 
    "post_filter": {       <--- change this 
     "nested": { 
     "path": "state", 
     "query": { 
      "bool": { 
       "filter": { 
        "term": { 
        "state.id": 101 
        } 
       } 
      } 
     } 
     } 
    }, 
    "aggs": { 
     "state": { 
     "nested": { 
      "path": "state" 
     }, 
     "aggs": { 
      "count": { 
       "terms": { 
        "field": "state.id" 
       } 
      } 
     } 
     } 
    } 
} 

Wenn Sie die verschachtelte Aggregation weiter eingrenzen möchten, können Sie auch hinzufügen ein Filter:

POST index/items/_search 
{ 
    "post_filter": { 
     "nested": { 
     "path": "state", 
     "query": { 
      "bool": { 
       "filter": { 
        "term": { 
        "state.id": 101 
        } 
       } 
      } 
     } 
     } 
    }, 
    "aggs": { 
     "narrow": { 
     "filter": { 
      "nested": { 
       "path": "state", 
       "query": { 
        "bool": { 
        "filter": { 
         "term": { 
          "state.id": 101 
         } 
        } 
        } 
       } 
      } 
     }, 
     "aggs": { 
      "state": { 
       "nested": { 
        "path": "state" 
       }, 
       "aggs": { 
        "count": { 
        "terms": { 
         "field": "state.id" 
        } 
        } 
       } 
      } 
     } 
     } 
    } 
} 
+0

Danke. Genau das, was ich brauchte. Noch eine Frage. Ich möchte den aktuellen Aggregationskontext auf einen bestimmten Satz von Dokumenten eingrenzen. Wie kann ich die Filteraggregation in einer verschachtelten Aggregation verwenden? [link] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html) – Joost

+1

Cool, froh, dass es geholfen hat. Ich habe meine Antwort aktualisiert. – Val

+0

Thx. Aber ich möchte die Aggregation für das verschachtelte Objekt filtern. '' ' "Filter": { "Begriffe": { "state.id": [101,102] } }, ' '' Und nur die Dokumente von "state.id" erhalten: 101 wie oben. – Joost

Verwandte Themen