[why]
get multi-field aggregation count for overview of report page.
[input]:
fields, query_items
(optional for query_items, default no scope limitation)
[example]
input:
fields = ['suite']
query_items = {
'os' => 'openeuler'
}
output:
[{"key"=>"build-pkg", "doc_count"=>186214},
{"key"=>"cci-depends", "doc_count"=>1230},
{"key"=>"iperf", "doc_count"=>1103},
{"key"=>"spinlock", "doc_count"=>1000},
{"key"=>"cci-makepkg", "doc_count"=>949},
{"key"=>"iperf-walk-os-test", "doc_count"=>474},
{"key"=>"bisect", "doc_count"=>381},
...
input:
fields = ['suite', 'job_state']
query_items = {
'os' => 'openeuler'
}
output:
[{"key"=>"build-pkg",
"doc_count"=>186227,
"all_job_state"=>
{"doc_count_error_upper_bound"=>0,
"sum_other_doc_count"=>0,
"buckets"=>
[{"key"=>"failed", "doc_count"=>3830},
{"key"=>"finished", "doc_count"=>803},
{"key"=>"incomplete", "doc_count"=>196},
{"key"=>"submit", "doc_count"=>136},
...
input:
fields = ['os', 'os_version', 'job_state']
query_items = {}
output:
[{"key"=>"openeuler",
"doc_count"=>193287,
"all_os_version"=>
{"doc_count_error_upper_bound"=>0,
"sum_other_doc_count"=>0,
"buckets"=>
[{"key"=>"20.03",
"doc_count"=>191789,
"all_job_state"=>
{"doc_count_error_upper_bound"=>0,
"sum_other_doc_count"=>0,
"buckets"=>
[{"key"=>"failed", "doc_count"=>3909},
{"key"=>"finished", "doc_count"=>2401},
{"key"=>"incomplete", "doc_count"=>300},
{"key"=>"submit", "doc_count"=>136},
{"key"=>"OOM", "doc_count"=>23},
{"key"=>"post_run", "doc_count"=>1}]}},
{"key"=>"20.03-SP1",
"doc_count"=>904,
"all_job_state"=>
{"doc_count_error_upper_bound"=>0,
"sum_other_doc_count"=>0,
"buckets"=>
[{"key"=>"failed", "doc_count"=>641},
...
Signed-off-by: Lu Kaiyi <2392863668(a)qq.com>
---
lib/es_query.rb | 70 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 70 insertions(+)
diff --git a/lib/es_query.rb b/lib/es_query.rb
index 88a420f..91aa6ab 100644
--- a/lib/es_query.rb
+++ b/lib/es_query.rb
@@ -87,6 +87,49 @@ class ESQuery
result
end
+
+ # input:
+ # fields, query_items
+ #
+ # fields => fields: Array(keyword)
+ # eg:
+ # ['suite', 'job_state']
+ #
+ # query_items => query_items: Hash(keyword, value)
+ # eg:
+ # {
+ # 'os' => 'openeuler',
+ # ...
+ # }
+ # (optional for query_items, default no scope limitation)
+ # output:
+ # [{"key"=>"build-pkg",
+ # "doc_count"=>186175,
+ # "all_job_state"=>
+ # {"doc_count_error_upper_bound"=>0,
+ # "sum_other_doc_count"=>0,
+ # "buckets"=>
+ # [{"key"=>"failed", "doc_count"=>3830},
+ # {"key"=>"finished", "doc_count"=>803},
+ # {"key"=>"incomplete", "doc_count"=>196},
+ # ...
+ def query_fields(fields, query_items = {})
+ field1 = fields.first
+ aggs_hash = build_aggs_from_fields(fields)
+ query = {
+ query: {
+ bool: {
+ must: build_multi_field_subquery_body(query_items)
+ }
+ },
+ aggs: aggs_hash['aggs'],
+ size: 0
+ }
+ result = @client.search(index: @index + '*', body: query)['aggregations']["all_#{field1}"]['buckets']
+ return nil if result.empty?
+
+ result
+ end
end
# Range Query Example:
@@ -146,3 +189,30 @@ def assign_desc_body(keyword)
}]
}
end
+
+# input:
+# fields = ['os', 'os_version', 'job_state']
+# output:
+# aggs_hash = {
+# "aggs"=>
+# {"all_os"=>
+# {"terms"=>{:field=>"os", :size=>1000},
+# "aggs"=>
+# {"all_os_version"=>
+# {"terms"=>{:field=>"os_version", :size=>1000},
+# "aggs"=>
+# {"all_job_state"=>{"terms"=>{:field=>"job_state", :size=>1000}}}}}}}
+# }
+def build_aggs_from_fields(fields)
+ aggs_hash = {}
+ return if fields.empty?
+
+ field = fields.shift
+ aggs_hash['aggs'] ||= {}
+ aggs_hash['aggs']["all_#{field}"] = {
+ 'terms' => { field: field, size: 1000 }
+ }
+ sub_aggs = build_aggs_from_fields(fields)
+ aggs_hash['aggs']["all_#{field}"].merge!(sub_aggs) if sub_aggs
+ aggs_hash
+end
--
2.23.0