2015-01-06 7 views
6

配列内の値に対して集計を行い、接頭辞によって返されるバケットもフィルタリングしようとしています。これが可能か、フィルターバケツを誤用しているかどうかはわかりません。ElasticSearch配列フィールドから集計をフィルタリングする

3文書:

{ "colors":["red","black","blue"] } 
{ "colors":["red","black"] } 
{ "colors":["red"] } 

目標は、文字Bで始まる色を持っている文書の数を得ることです:戻ってくる

{ 
    "size":0, 
    "aggs" : { 
    "colors" : { 
     "filter" : { "prefix" : { "colors" : "b" } }, 
     "aggs" : { 
     "top-colors" : { "terms" : { "field":"colors" } } 
     } 
    } 
    } 
} 

結果は、残念ながらレッドが含まれます。なぜなら、赤色の文書は、青色および/または黒色も有するため、依然としてフィルタによって一致するからである。

"aggregations": { 
"colors": { 
    "doc_count": 2, 
    "top-colors": { 
    "buckets": [ 
     { 
     "key": "black", 
     "doc_count": 2 
     }, 
     { 
     "key": "red", 
     "doc_count": 2 
     }, 
     { 
     "key": "blue", 
     "doc_count": 1 
     } 
    ] 
    } 
} 
} 

バケットの結果をフィルタリングする方法はありますか?

答えて

7

これを試して、それがために値そのものが作成されたバケットをフィルタします:

{ 
    "size": 0, 
    "aggs": { 
    "colors": { 
     "filter": { 
     "prefix": { 
      "colors": "b" 
     } 
     }, 
     "aggs": { 
     "top-colors": { 
      "terms": { 
      "field": "colors", 
      "include": { 
       "pattern": "b.*" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Woops、私は逃した方法がわからないというドキュメントでは、感謝! – scott

関連する問題