Условие по агрегации сроков - PullRequest
0 голосов
/ 03 апреля 2019

Я хотел бы поместить условие в другие данные фильтра слов на основе агрегированных данных.

В настоящее время у меня есть запрос

GET sense/_search
{
  "size": 0,
  "aggs": {
    "dates": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1d",
        "format": "yyyy-MM-dd",
        "offset": "+4h"
      },
      "aggs": {
        "unique_sessions": {
          "terms": {
            "field": "sessionId"
          }
        }
      }
    }
  }
}

, который возвращает данные такого типа

{
  "aggregations" : {
    "dates" : {
      "buckets" : [
        {
          "key_as_string" : "2019-03-31",
          "key" : 1554004800000,
          "doc_count" : 14,
          "unique_sessions" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "83e1c3a4-341c-4ac3-a81e-f00336ee1dfb",
                "doc_count" : 3
              },
              {
                "key" : "99c4d312-2477-4bf7-ad02-ef76f50443f9",
                "doc_count" : 3
              },
              {
                "key" : "425b840f-9604-4f1d-ab18-96a9a7ae44e0",
                "doc_count" : 1
              },
              {
                "key" : "580b1f6c-6256-4f38-9803-2cc79a0a63d7",
                "doc_count" : 2
              },
              {
                "key" : "8929d75d-153c-4b66-8dd7-2eacb7974b95",
                "doc_count" : 1
              },
              {
                "key" : "8da5d732-d1e7-4a63-8f02-2b84a8bdcb62",
                "doc_count" : 2
              }
            ]
          }
        },
        {
          "key_as_string" : "2019-04-01",
          "key" : 1554091200000,
          "doc_count" : 1,
          "unique_sessions" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "513d4532-304d-44c7-bdc7-398795800383",
                "doc_count" : 1
              },
              {
                "key" : "8da5d732-d1e7-4a63-8f02-2791poc34gq1",
                "doc_count" : 2
              }
            ]
          }
        }
      ]
    }
  }
}

Итак, я хотел бы получить количество уникальных sesssionId, где doc_count равно 1.

Это означает, что я ожидаю результата, где гистограмма даты с ключом "2019-03-31" будет отображать 2 (поскольку агрегация с именем unique_sessions в сегментах имеет только две сессии с doc_count, равным единице) и соответственно "2019-04-01" будет отображать 1 в результате.

Понятия не имею, как реализовать это объединение.

1 Ответ

1 голос
/ 03 апреля 2019

Вам нужно будет использовать Агрегат селектора ковшей на имеющихся у вас терминах агрегации.

Ниже показано, как будет выглядеть ваш запрос:

Пример запроса

POST <your_index_name>/_search
{  
   "size":0,
   "aggs":{  
      "dates":{  
         "date_histogram":{  
            "field":"@timestamp",
            "interval":"1d",
            "format":"yyyy-MM-dd",
            "offset":"+4h"
         },
         "aggs":{  
            "unique_sessions":{  
               "terms":{  
                  "field":"sessionId"
               },
               "aggs":{  
                  "unique_buckets":{  
                     "bucket_selector":{  
                        "buckets_path":{  
                           "count":"_count"
                        },
                        "script":"params.count==1"
                     }
                  }
               }
            }
         }
      }
   }
}

Обратите внимание, что в этой ситуации вы получите пустые сегменты, как указано в ответе ниже.,

Пример ответа

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 9,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "dates": {
      "buckets": [
        {
          "key_as_string": "2018-12-31",
          "key": 1546228800000,
          "doc_count": 3,
          "unique_sessions": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "83e1c3a4-3AFA1c-4ac3-a81e-f00336ee1dfb",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key_as_string": "2019-01-01",
          "key": 1546315200000,
          "doc_count": 0,
          "unique_sessions": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "2019-01-02",
          "key": 1546401600000,
          "doc_count": 3,
          "unique_sessions": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "2019-01-03",
          "key": 1546488000000,
          "doc_count": 3,
          "unique_sessions": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "83e1c3a4-3AFA1c-4ab3-a81e-f00336ee1dfb",
                "doc_count": 1
              }
            ]
          }
        }
      ]
    }
  }
}

В этом случае, если вы хотите отфильтровать сегменты, чтобы показать только родительские сегменты, которые соответствуют дочерним сегментам, имеющим count==1, просто воспользуйтесь приведенным нижезапрос, где я добавил еще одно предложение выбора сегмента.

Внимательно обратите внимание на структуру запроса.

Уточненное решение для запроса:

POST <your_index_name>/_search
{  
   "size":0,
   "aggs":{  
      "dates":{  
         "date_histogram":{  
            "field":"@timestamp",
            "interval":"1d",
            "format":"yyyy-MM-dd",
            "offset":"+4h"
         },
         "aggs":{  
            "unique_sessions":{  
               "terms":{  
                  "field":"sessionId"
               },
               "aggs":{  
                  "unique_buckets":{  
                     "bucket_selector":{  
                        "buckets_path":{  
                           "count":"_count"
                        },
                        "script":"params.count==1"
                     }
                  }
               }
            },
            "terms_bucket_clause": {
              "bucket_selector": {
                "buckets_path": {
                  "count": "unique_sessions._bucket_count"
                },
                "script": "params.count>0"
              }
            }
         }
      }
   }
}

Уточненный ответ на запрос

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 9,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "dates": {
      "buckets": [
        {
          "key_as_string": "2018-12-31",
          "key": 1546228800000,
          "doc_count": 3,
          "unique_sessions": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "83e1c3a4-3AFA1c-4ac3-a81e-f00336ee1dfb",
                "doc_count": 1
              }
            ]
          }
        },
        {
          "key_as_string": "2019-01-03",
          "key": 1546488000000,
          "doc_count": 3,
          "unique_sessions": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
              {
                "key": "83e1c3a4-3AFA1c-4ab3-a81e-f00336ee1dfb",
                "doc_count": 1
              }
            ]
          }
        }
      ]
    }
  }
}

Обратите внимание на разницу врезультаты в обоих запросах.Надеюсь, это поможет!

...