本は続きます、
前の記事は集約された結果をソートするelasticsearchについて書きました
この記事では、集計後にスコープをフィルタリングする方法について説明します。
一般に、クエリまたはフィルターで範囲を使用して範囲フィルタリングを実行できますが、集計結果の範囲に一致するように集計結果をフィルタリングするにはどうすればよいですか?
dslステートメントは次のとおりです。
"aggregations": {
"statistics_assets": {
"terms": {
"field": "one_account.one_account_no",
"size": 10
},
"aggregations": {
"assets": {
"sum": {
"field": "assets.merge"
}
},
"assets_sum_range": {
"bucket_selector": {
"buckets_path": {
"key": "assets"
},
"script": {
"source": "0<=params.key&¶ms.key<=100000",
"lang": "painless"
}
}
}
}
}
}
合計集計後の「assets.merge」の結果をフィルタリングするには、assets_sum_rangeのbucket_selectorを使用します。フィルター条件の範囲は0 <=集計結果<= 100000です。
Javaコード:
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("statistics_assets")
.field("one_account.one_account_no")
.size(10);
AggregationBuilder assetsAggregation = AggregationBuilders.sum("assets").field("assets.merge");
termsAggregationBuilder.subAggregation(assetsAggregation);
//对聚合后的总资产进行范围选择
Map<String, String> bucketsPathsMap = new HashMap<>();
bucketsPathsMap.put("key", "assets");
Script script = new Script( "0<=params.key&¶ms.key<=100000" );
BucketSelectorPipelineAggregationBuilder bs = PipelineAggregatorBuilders.bucketSelector("assets_sum_range", bucketsPathsMap, script);
termsAggregationBuilder.subAggregation(bs);
searchSourceBuilder.aggregation(termsAggregationBuilder);
最終的な出力は、0〜100000の範囲の集計結果です。
"aggregations" : {
"statistics_assets" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 4,
"buckets" : [
{
"key" : "110600000973",
"doc_count" : 2,
"assets" : {
"value" : 0.0
}
},
{
"key" : "105100015207",
"doc_count" : 1,
"assets" : {
"value" : 9.999
}
}
]
}
}
解説:elasticsearch - JavaAPIで
バケットフィルターを作成する方法