2017-12-16 4 views
0

この質問をどのように形成するかはわかりませんので、私はその例に飛びます。私は、次の書類を持っていると仮定すると:ネストされた条件の集計が兄弟の上に集まる

elementsは、ネストされた文書を含む
{ 
    elements: [ 
     {name: 'foo'}, 
     {name: 'bar'}, 
     {name: 'baz'} 
    ] 
}, 
{ 
    elements: [ 
     {name: 'foo'}, 
     {name: 'baz'} 
    ] 
} 

。私はすべてnameを集計して、兄弟がその要素に何回出現したかを数えることができるようにしたいと考えています。

I.e.

{ 
    foo: { 
     bar: 1, 
     baz: 2 
    }, 
    bar: { 
     foo: 1, 
     baz: 1 
    }, 
    baz: { 
     foo: 2, 
     bar: 1 
    } 
} 

elasticsearch集約を使用してこれを行うためのきちんとした方法はありますか? ESでの集約の私の初歩的な理解は私のような何かをしていた:

"aggs": { 
    "elements": { 
     "nested": { 
      "path": "elements" 
     }, 
     "aggs": { 
      "names": { 
       "terms": { 
        "field": "elements.name", 
        "size": 20 
       }, 
       "aggs": { 
        "more_elements": { 
         "terms": { 
          "field": "elements.name", 
          "size": 20 
         } 
        } 
       } 
      } 
     } 
    } 
} 

これは完全に間違った結果を与えます。私は次のようなものになります:

{ 
    foo: { 
     doc_count: 2, 
     foo: 2 
    }, 
    bar: { 
     doc_count: 1, 
     foo: 1 
    }, 
    baz: { 
     doc_count: 2, 
     foo: 2 
    } 
} 

何か助けていただきありがとうございます!私が現在ES 5.4を使用しているのは重要です。

答えて

0

ワンステップで行う方法が見つかりません。

ステップ1:すべてのelements.namesを見つける:

{ 
    "size": 0, 
    "aggs": { 
    "elements": { 
     "nested": { 
     "path": "elements" 
     }, 
     "aggs": { 
     "names": { 
      "terms": { 
      "field": "elements.name", 
      "size": 20 
      } 
     } 
     } 
    } 
    } 
} 

ステップ2:各element.nameについてん:

{ 
    "size": 0, 
    "aggs": { 
    "bool_agg": { 
     "filter": { 
     "bool": { 
      "must": { 
      "term": { 
       "elements.name": "NAME_HERE" 
      } 
      } 
     }, 
     "aggs": { 
      "names": { 
      "terms": { 
       "field": "elements.name", 
       "size": 20 
      } 
      } 
     } 
     } 
    } 
    } 
} 

ご注意をすることを私は2つのステップにそれを分離します 私はここでネストされた集約を使用していません - filter aggregationは、現在の名前を含むすべての(完全な)ドキュメントをフィルタリングします。私はちょうどすべての兄弟(および現在の名前の出現番号を取得しているよりも、それも同様に削除することができます)。