2016-07-29 6 views
1

質問の策定方法がわかりません。 私はElasticsearch 2.2を使用しています。弾性検索:バケット値を使用したフィルタ集約

は5つの文書で作られたデータセットの例で始まるのをしてみましょう:

[ 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": {}, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "a" }, 
     "coverage_entity": { "uuid": "b" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 1 
    } 
    }, 
    { 
    "header": { 
     "called_entity": { "uuid": "b" }, 
     "coverage_entity": { "uuid": "a" }, 
     "sucessful_transfers": 0 
    } 
    } 
] 

called_entityは常にUUIDを持っています。 coverage_entityは空でもよく、uuidであってもよい。

私はどちらか をcalled_entity.uuidか をcoverage_entity.uuidに集約するスクリプトを使用し

{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim1": { 
     "terms": { 
     "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']", 
     "size": 10 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     } 
     } 
    } 
    } 
} 

だから今、凝集がheader.called_entity.uuidのいずれかから用語を生成している、またはheader.coverage_entity.uuid

アグリゲーションキーの値を使用してアグリゲーションをフィルタリングするにはどうすればよいですか?たとえば、バケツごとに、uuidのドキュメントのうち、いくつかのドキュメントを数えたい場合は、header.called_entity.uuydから取得します。次のようなものがあります。

{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim1": { 
     "terms": { 
     "script" : "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']", 
     "size": 10 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.successful_transfers" 
      } 
     }, 
     "from_called_entity": { 
      "filter": { 
      "term": { "header.called_entity.uuid": BUCKET_KEY } 
      } 
     } 
     } 
    } 
    } 
} 

答えて

0

わかりません。キー自体はソートオプションとしてのみ使用できます。

あなたはこのようなもの使用することができます別の決勝を追加し、あなたが本当にその特定の方法でJSONを持っている必要がある場合は

"called_entity_source": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 2 
     }, 
     { 
      "key": "b", 
      "doc_count": 2 
     } 
    ] 
    }, 
    "coverage_entity_source": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 2 
     }, 
     { 
      "key": "b", 
      "doc_count": 1 
     } 
    ] 
    }, 
    "dim1": { 
    "doc_count_error_upper_bound": 0, 
    "sum_other_doc_count": 0, 
    "buckets": [ 
     { 
      "key": "a", 
      "doc_count": 4, 
      "successful_transfers": { 
       "value": 3 
      } 
     }, 
     { 
      "key": "b", 
      "doc_count": 3, 
      "successful_transfers": { 
       "value": 2 
      } 
     } 
    ] 
    } 

{ 
    "size": 0, 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "dim1": { 
     "terms": { 
     "script": "return doc['header.called_entity.uuid'] + doc['header.coverage_entity.uuid']", 
     "size": 10 
     }, 
     "aggs": { 
     "successful_transfers": { 
      "sum": { 
      "field": "header.sucessful_transfers" 
      } 
     } 
     } 
    }, 
    "called_entity_source": { 
     "terms": { 
     "field": "header.called_entity.uuid", 
     "size": 10 
     } 
    }, 
    "coverage_entity_source": { 
     "terms": { 
     "field": "header.coverage_entity.uuid", 
     "size": 10 
     } 
    } 
    } 
} 

を、出力は次のようなものになりますあなたのアプリケーションでステップを実行して、結果を少し処理します。上記の結果には必要な情報が含まれていますが、coverage_entity_sourcecalled_entity_sourceのキーはdimアグリゲーションの対象外です。

+0

私の単純化された例ではうまくいくはずですが、called_entity、coverage_entity、both、および/または他のフィールドのブール条件である各集約に対してより複雑なフィルタを行う必要があります。とにかくありがとう...私はキーがスクリプトで少なくとも利用可能であることを望んでいたが、私はドキュメントや他の質問で何かを見つけることができなかったことを期待していた... – Raphael

+0

実際には、(私は両方の集約サーバー側、 ElasticSearchからの応答を受け取った後)。どうもありがとう! – Raphael