基于不同数据值的弹性搜索过滤直方图

问题描述 投票:0回答:0

所以基本上,我来自大众传播背景。我向最终用户发送消息并捕获来自最终用户的所有后续事件的地方。我向最终用户发送一条消息,在该消息上我收到消息传递信息,如处理、发送、传递、打开、阅读、单击等。

此过程用于以下步骤:

  1. 发送消息
  2. 接收发送事件
  3. 收货事件
  4. 收到公开活动
  5. 接收阅读事件
  6. 接收点击事件(在消息中的链接和用户点击它们的情况下)。

我添加了一些额外的信息。当用户打开消息时,我会捕获他们的用户代理详细信息,例如如果用户从 iOS 设备打开消息,我会将用户代理设置为 9808,如果是 Android 设备,我会设置多个值根据 Android 设备类型或手机,例如 1012、1013 和 1023。

基于上述场景,我生成了一个摘要,其中我计算了请求总数及其统计信息。喜欢

  1. 发送的请求总数
  2. 发送的消息总数
  3. 打开的请求总数
  4. 点击的消息总数
  5. 开放式等

我已经给出了一个过滤器,最终用户可以根据它来过滤摘要。像

一样过滤
  1. 发送总数
  2. 全开
  3. 开放式即 iOS 开放,或用户开放

希望如此。到目前为止,您已经确定了我的基本用例。现在让我们谈谈数据管理以及我如何在 Elasticsearch 中管理所有这些信息。

所以基本的文档字段和映射如下:

资料文件:

{
    "took": 12,
    "timed_out": false,
    "_shards": {
        "total": 38,
        "successful": 38,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 1,
            "relation": "eq"
        },
        "max_score": 0.0,
        "hits": [{
            "_index": "sample-202304",
            "_type": "logs",
            "_id": "16825338034249531",
            "_score": 0.0,
            "_source": {
                "clientid": 61448,
                "dsndate": "2023-04-27 12:15:29",
                "subject": "You've been added to a group!",
                "dtime": "2023-04-27 12:15:29",
                "latency": -1,
                "adate": 20230427,
                "itime": "2023-04-27 12:15:30",
                "inj_type": "WHATSAPP",
                "gtime": "2023-04-27 12:15:30",
                "counts_opens": 2,
                "segment_type": 3,
                "msize": 15994,
                "ptime": "2023-04-27 12:15:28",
                "timestamp": 1682585036,
                "atime": "2023-04-27 12:15:30",
                "rdom": "gmail.com",
                "ip": "172.253.115.27",
                "message_id": "",
                "rcpt_email": "sample@gmail.com",
                "fdom": "sample.com",
                "misc1": "",
                "counts_clicks": 0,
                "opens": [{
                        "ip": "103.28.116.12",
                        "useragent": 9808,
                        "time": "2023-04-27 13:02:03"
                    },
                    {
                        "ip": "173.219.224.46",
                        "useragent": 2812,
                        "time": "2023-04-27 15:44:09"
                    },
                    {
                        "ip": "172.219.224.46",
                        "useragent": 2812,
                        "time": "2023-04-27 15:44:09"
                    }
                ],
                "udate": "2023-04-27 15:44:09",
                "fromaddress": "fantasysports@sample.com",
                "custom_data": "",
                "remarks": "173.253.115.27 - 250 2.0.0 OK e9-20020a0562140d8900b005771786395bsi11489394qve.154 - gsmtp (in reply to EOD command)",
                "status": 2
            }
        }]
    }
}

在上面的示例 JSON 中,我正在管理有关特定消息的所有基本信息。我非常喜欢我有很多具有相同数据结构但属性不同的文档。

现在我想根据过滤器类型过滤所有文档。

如果最终用户选择的是open类型,相当于machine open,那么应该算作machine open。必须为其打开过滤器值。用户代理 = 9808

如果终端用户选择了open类型,相当于user open,那么应该算作一个user open。其过滤器值不得包括打开。 useragent = 9808(即除 9808 之外的所有值或 opens.useragnet 数组中不应包含值 9808)

简而言之,过滤器就像

  1. 用户打开=打开。 useragent 字段不应包含值 9808.
  2. machin open = opens.useragent 除 9808 外,useragent 字段应包含任何其他值。

在上面的elasticsearch文档中,open字段包含了一组多个事件,比如用户打开了两次,机器打开了一次。在这种情况下,它应该总结为用户开放,因为它具有用户开放值,反之亦然。

如果它只包含 9808 那么它应该被认为是一个 machin open

目前,我正在运行以下查询,通过它我得到了 iPhone 打开总数的日期汇总,这是不正确的,因为唯一的 IOS 打开。因为 useragent 字段也包含用户开放值,

curl -X GET "localhost:9200/index-202305,index-202304,index-202303,index-202302/_search?from=0&size=0&pretty" -H 'Content-Type: application/json' -d'{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "adate": {
              "gte": "20230427",
              "lte": "20230427"
            }
          }
        },
        {
          "term": {
            "clientid": "61448"
          }
        },
        {
          "exists": {
            "field": "status"
          }
        },
        {
          "exists": {
            "field": "msize"
          }
        },
        {
          "exists": {
            "field": "adate"
          }
        }
      ]
    }
  },
  "aggs": {
    "daywise_summary": {
      "date_histogram": {
        "field": "adate",
        "interval": "day"
      },
      "aggs": {
        "mailwise": {
          "terms": {
            "field": "status",
            "size": 100000
          }
        },
        "open": {
          "sum": {
            "field": "counts_opens"
          }
        },
        "click": {
          "sum": {
            "field": "counts_clicks"
          }
        },
        "msize": {
          "sum": {
            "field": "msize"
          }
        },
        "iphone_bot_opens": {
          "filter": {
            "term": {
              "opens.useragent": "9808"
            }
          }
        },
        "iphone_bot_clicks": {
          "filter": {
            "term": {
              "clicks.useragent": "9808"
            }
          }
        },
        "amp_clicks": {
          "filter": {
            "term": {
              "clicks.is_amp": 1
            }
          }
        },
        "amp_opens": {
          "filter": {
            "term": {
              "opens.is_amp": 1
            }
          }
        }
      }
    }
  }
}'

从上面的查询中,我得到以下输出

{
  "took" : 4592,
  "timed_out" : false,
  "_shards" : {
    "total" : 38,
    "successful" : 38,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10000,
      "relation" : "gte"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "daywise_summary" : {
      "buckets" : [
        {
          "key_as_string" : "20230427",
          "key" : 1682553600000,
          "doc_count" : 3024404,
          "iphone_bot_opens" : {
            "doc_count" : 571625
          },
          "mailwise" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : 1,
                "doc_count" : 2067057
              },
              {
                "key" : 2,
                "doc_count" : 929159
              },
              {
                "key" : 9,
                "doc_count" : 14366
              },
              {
                "key" : 6,
                "doc_count" : 11136
              },
              {
                "key" : 4,
                "doc_count" : 1943
              },
              {
                "key" : 10,
                "doc_count" : 707
              },
              {
                "key" : 8,
                "doc_count" : 22
              },
              {
                "key" : 7,
                "doc_count" : 14
              }
            ]
          },
          "amp_opens" : {
            "doc_count" : 0
          },
          "amp_clicks" : {
            "doc_count" : 0
          },
          "msize" : {
            "value" : 4.4637554424E10
          },
          "iphone_bot_clicks" : {
            "doc_count" : 0
          },
          "click" : {
            "value" : 2025.0
          },
          "open" : {
            "value" : 1212205.0
          }
        }
      ]
    }
  }
}

请建议正确的查询,我可以在其中区分唯一机器打开和唯一用户打开的端到端隔离以及日期摘要。

请建议正确的查询,我可以在其中区分唯一机器打开和唯一用户打开的端到端隔离以及日期摘要。

elasticsearch filter summary
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.