2017-07-29 12 views
0

をフィルタリング集約は、私が弾性で3行からインデックスを持っているとしますElasticSearch:簡単にするため

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

私は一致するドキュメント内の他のタグの結果を返さずに、いくつかのタグで集計する必要があります。

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

この結果を(おそらく)後処理する方法は?

インデックスの3行の場合、これは3つの余分なアイテム(t3、t4、t5)のみであるためです。しかし、現実の状況で私はインデックスに200Kを超える行を持っており、それは恐ろしいです!私は50個のタグで集計が必要ですが、1K個以上のタグで結果が得られます。

答えて

1

ご使用のバージョンのElasticsearchでサポートされていると仮定すると、用語集に「include」属性を使用する必要があります。あなたのクエリは、上記のようにする必要があります:

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

`` `

関連する問題