我在Elasticsearch中有数据。
这是我的实际文档https://docs.google.com/document/d/1DKID90I9ulUcut-S8UfrnSjY-3citEwmyfnJJmrIRU8/edit?usp=sharing
doc:
{
store_id:"abc",
event_timestamp:"2019-06-05 13:00:05",
event_type:"heartbeat"
}
我在输入中有store_id,日期范围和事件类型。在输出中,我需要设备在该小时内在线的时间百分比。
这就是我们在线考虑设备的方式。 如果一个小时内store_id发生event =“ heartbeat”,那么我们说商店在线。
示例1。
因此,如果范围是“ 2019-05-07”至“ 2019-05-08”,并且有14个文档的小时数不同,则百分比将为(14 /(2 * 24))* 100 >
示例2。
doc:
{
store_id:"abc",
event_timestamp:"2019-06-05 13:00:05",
event_type:"heartbeat"
}
doc:
{
store_id:"abc",
event_timestamp:"2019-06-05 14:00:05",
event_type:"heartbeat"
}
doc:
{
store_id:"abc",
event_timestamp:"2019-06-05 14:00:05",
event_type:"heartbeat"
}
如果输入是store_id =“ abc”和date_range =“ 2019-06-05”到“” 2019-06-05“和event_type =” heartbeat“,则输出为(2 /(1 * 24)),因为该商店的event = heartbeat只有两个不同的小时。
这是我对累计总和的查询。如果有一些如何将最终的累计总和除以日期之间的差异的话。
GET /internship38/_search
{
"query":
{
"bool":
{
"must":
[
{
"match" :
{
"attributes.store_id" : "41b15888-0c2f-48f9-89d0-dc7aad19f52b"
}
},
{
"match":
{
"event_type":"app_sent_heartbeat"
}
}
]
}
},
"aggs":
{
"my_date_histo":{
"date_histogram":{
"field":"arrival_timestamp",
"interval":"day"
},
"aggs":
{
"distinct_hours": {
"cardinality": {
"script": {
"lang": "painless",
"source": "doc[params.date_field].value.hourOfDay;",
"params": {
"date_field": "arrival_timestamp"
}
}
}
},
"cumulative_hours": {
"cumulative_sum": {
"buckets_path": "distinct_hours"
}
}
}
}
}
}
可以用Java完成吗?例如https://www.programcreek.com/java-api-examples/?api=org.elasticsearch.script.Script
答案 0 :(得分:0)
如果您可以使用“ agss”功能将查询重新格式化为“ bucket”,则Elasticsearch文档中的上方链接将有所帮助。
来自链接:
{
"size": 0,
"aggs" : {
"sales_per_month" : {
"date_histogram" : {
"field" : "date",
"calendar_interval" : "month"
},
"aggs": {
"total_sales": {
"sum": {
"field": "price"
}
},
"t-shirts": {
"filter": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"sales": {
"sum": {
"field": "price"
}
}
}
},
"t-shirt-percentage": {
"bucket_script": {
"buckets_path": {
"tShirtSales": "t-shirts>sales",
"totalSales": "total_sales"
},
"script": "params.tShirtSales / params.totalSales * 100"
}
}
}
}
}
}