Как написать запрос, чтобы найти проценты вasticsearch? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть данные вasticsearch.

это мой фактический документ 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, диапазон дат и тип события в файле input.in, мне нужно процентное количество времени, когда устройство было в сетина этот час.

Вот как мы считаем устройство онлайн.Если в течение часа для store_id происходит событие = "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"   
}

, если input был store_id = "abc" и date_range = "2019-06-05" to "" 2019-06-05 "и event_type =" heartbeat ", тогда вывод будет (2 / (1 * 24)), потому что есть только два разных часа с событием = 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

1 Ответ

0 голосов
/ 11 июля 2019

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-script-aggregation.html

Приведенная выше ссылка в документации эластичного поиска поможет, если вы сможете переформатировать свой запрос в «корзины» с помощью функции «aggs».

по ссылке:

{
    "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"
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...