2017-07-29 4 views
0

Der Einfachheit halber nehme ich Index aus 3 Reihen in elastischen:Elasticsearch: Aggregation Filterung

{"id": 1, "tags": ["t1", "t2", "t3"]}, 
{"id": 2, "tags": ["t1", "t4", "t5"]} 

ich von einigen Tags aggregieren müssen ohne Ergebnis anderer Tags in passenden Dokumenten Rückkehr:

{ 
    "aggs": { 
    "tags": { 
     "terms": {"field": "tags"} 
    } 
    }, 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "terms": {"tags": ["t1", "t2"]} 
     } 
     ] 
    } 
    } 
} 

# RESULT 
{ 
    "aggregations": { 
     "tags": { 
      "buckets": [ 
       {"doc_count": 2, "key": "t1"}, 
       {"doc_count": 1, "key": "t2"}, 
       {"doc_count": 1, "key": "t3"}, # should be removed by filter 
       {"doc_count": 1, "key": "t4"}, # should be removed by filter 
       {"doc_count": 1, "key": "t5"}, # should be removed by filter 
      ], 
     } 
    }, 
    "hits": { 
     "hits": [], 
     "max_score": 0.0, 
     "total": 2 
    }, 
} 

Wie (vielleicht) postfilter dieses Ergebnis?

Weil im Falle von 3 Zeilen im Index dies nur 3 zusätzliche Elemente (t3, t4, t5). Aber in der realen Situation habe ich mehr als 200K Reihen im Index und es ist schrecklich! Ich brauche insgesamt 50 Tags, aber ich bekomme Ergebnisse mit mehr als 1K Tags.

Antwort

1

Angenommen, Ihre Version von Elasticsearch unterstützt es, sollte ich das Attribut "include" für den Begriff Aggregation verwenden. Ihre Abfrage sollte wie oben sein:

POST /test/_search 
{ 
    "aggs": { 
    "tags": { 
     "terms": {"field": "tags", "include": ["t1", "t2"]} 
    } 
    }, 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "terms": {"tags": ["t1", "t2"]} 
     } 
     ] 
    } 
    } 
} 

`` `