gpt4 book ai didi

elasticsearch - Elasticsearch-查找仅来自匿名请求的IP

转载 作者:行者123 更新时间:2023-12-02 22:26:57 25 4
gpt4 key购买 nike

我的Elasticsearch中有网络日志。每个日志都有一个用户名和一个IP字段。像这样:

{"username":"user1", "ip": "1.2.3.4"}
{"username":"anonymous", "ip": "1.2.3.4"}
{"username":"anonymous", "ip": "2.3.4.5"}
{"username":"user2", "ip": "3.4.5.6"}
我有一个看似简单的任务:列出仅匿名请求来自的所有IP。问题是,我不能简单地过滤出匿名IP,因为那样的话,我会列出与匿名出现但不是唯一出现的虚假IP。我可以通过3个步骤手动完成此操作:
  • 列出所有唯一IP-s
  • 列出与匿名
  • 以外的其他内容一起出现的唯一IP-s
  • 从第一个列表中排除第二个列表的项目。

  • 但是有没有办法通过单个ES查询来做到这一点?我的本能是使用 bool(boolean) 查询。我当前的方法是这样的:
    GET /sample1/_search
    {
    "query": {
    "bool": {
    "must": {
    "wildcard": {
    "ip": "*"
    }
    },
    "must_not": {
    "term": {
    "username": "-anonymous"
    }
    }
    }
    },
    "size": 0,
    "aggs": {
    "ips": {
    "terms": {
    "field": "ip.keyword"
    }
    }
    }
    }
    我希望使用“2.3.4.5”,但是它将返回所有3个唯一IP。我在网上搜索并尝试了数小时的不同查询类型。有任何想法吗?

    最佳答案

    请找到以下映射,示例文档,针对您的方案的相应查询和响应:
    对应:

    PUT my_ip_index
    {
    "mappings": {
    "properties": {
    "user":{
    "type": "keyword"
    },
    "ip":{
    "type": "ip"
    }
    }
    }
    }
    文件:
    POST my_ip_index/_doc/1
    {
    "user": "user1",
    "ip": "1.2.3.4"
    }

    POST my_ip_index/_doc/2
    {
    "user": "anonymous",
    "ip": "1.2.3.4"
    }

    POST my_ip_index/_doc/3
    {
    "user": "anonymous",
    "ip": "2.3.4.5"
    }

    POST my_ip_index/_doc/4
    {
    "user": "user2",
    "ip": "3.4.5.6"
    }
    汇总查询:
    POST my_ip_index/_search
    {
    "size": 0,
    "aggs": {
    "my_valid_ips": {
    "terms": {
    "field": "ip",
    "size": 10
    },
    "aggs": {
    "valid_users": {
    "terms": {
    "field": "user",
    "size": 10,
    "include": "anonymous"
    }
    },
    "min_bucket_selector": {
    "bucket_selector": {
    "buckets_path": {
    "valid_users_count": "valid_users._bucket_count",
    "my_valid_ips_count": "_count"
    },
    "script": {
    "source": "params.valid_users_count == 1 && params.my_valid_ips_count == 1"
    }
    }
    }
    }
    }
    }
    }
    注意上面的查询中我是如何使用 Terms AggregationBucket Selector Aggregation的。
    我在术语Agg中添加了 include部分,以便仅考虑 anonymous用户,并且存储桶聚合中的逻辑是仅在顶级术语聚合中将单个文档计数过滤掉,例如 2.3.4.5后跟第二级术语聚合中的单个存储桶计数。
    响应:
    {
    "took" : 1,
    "timed_out" : false,
    "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
    },
    "hits" : {
    "total" : {
    "value" : 4,
    "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
    },
    "aggregations" : {
    "my_valid_ips" : {
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : [
    {
    "key" : "2.3.4.5", <---- Expected IP/Answer
    "doc_count" : 1,
    "valid_users" : {
    "doc_count_error_upper_bound" : 0,
    "sum_other_doc_count" : 0,
    "buckets" : [
    {
    "key" : "anonymous",
    "doc_count" : 1
    }
    ]
    }
    }
    ]
    }
    }
    }
    希望能帮助到你!

    关于elasticsearch - Elasticsearch-查找仅来自匿名请求的IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62792929/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com