Elasticsearch - 聚合获取原始数据并分页排序模糊查询

news2024/7/6 18:25:39

文章目录

  • 概述
  • 第一步 : 聚合获取原始数据并分页
    • 知识点:bucket_sort实现分页
    • 知识点:获取 total -----> cardinality 去重
  • 小结
  • 第二步 分页并支持模糊查询
    • 方式一 query 方式
    • 方式二: 脚本
      • cardinality 的 script

在这里插入图片描述

概述

ES版本: 7.6.

在这里插入图片描述

需要按照主机ID 进行告警时间的汇总,并且还得把主机相关的信息展示出来。

注: 所有的数据都存在索引中, 通过一个DSL查询展示

实际上就是将terms聚合的结果以列表形式分页展示。

在这里插入图片描述


第一步 : 聚合获取原始数据并分页

GET index_name/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "getAlarmStatistByHostId": {
      "terms": {
        "field": "host_id",
        "size": 100000,
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "host_details": {
          "top_hits": {
            "size": 1,
            "_source": {
              "include": [
                "host_nameame",
                "host_ip",
                "host_mac"
              ]
            }
          }
        },
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 2,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
        "field": "host_id",
        "precision_threshold": 40000
      }
    }
  }
}


知识点:bucket_sort实现分页

  • bucket_sort中 from不是pageNum,如想实现pageNum效果,from=pageNum*size即可;
  • terms聚合的size,实际上size可以尽可能的设置大一点,具体大小按实际情况来看;
"myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 2,
            "gap_policy": "SKIP"
          }
        }

在 bucket_sort 中,可以指定以下其他参数:

  • from: 从哪个桶开始排序,默认是0,表示从第一个桶开始
  • size: 每个桶有多少个桶,默认是2,表示每个桶有2个桶 (其实就是每页展示多少条数据)
  • gap_policy: 桶之间的策略,可选值有:
    • SKIP: 跳过空桶,默认值
    • INTERPOLATE: 使用非空桶的最小和最大值来填充空桶
    • FAIL: 如果遇到空桶,直接失败

所以上述的配置的意思是

  • 从第一个桶开始排序
  • 每个桶有2个子桶
  • 遇到空桶时跳过空桶
    这可以让我们更加精细地控制桶的划分和处理。

知识点:获取 total -----> cardinality 去重

 "termsCount": {
      "cardinality": {
        "field": "host_id",
        "precision_threshold": 40000
      }
    }
  • field: 指定要计算基数的字段,这里是 host_id
  • precision_threshold: 基数的精度 threshold,默认为 40000。高于这个阈值,返回的基数为 estimated 值,低于这个阈值,返回 exact 值。

在 Elasticsearch 中,cardinality 算法用来计算字段的基数(不重复的值的个数).

cardinality 算法是通过 HyperLogLog 算法实现的,所以它很高效,可以支持大规模数据的基数统计,并且精度很高。 缺省值为3000

在这里插入图片描述

精度阈值选项允许用内存交换精度,并定义了一个唯一的计数,在该计数低于此值时,预计计数接近准确。超过这个值,计数可能会变得有点模糊。支持的最大值是40000,高于这个数字的阈值将具有与40000阈值相同的效果。缺省值为3000。

默认情况下,如果基数超过 40000,cardinality 会返回 estimated 值(估算值),否则返回 exact 值(精确值)。如果文档个数远大于40000,那么会返回estimated值,比如50000, 可以通过 precision_threshold 参数控制这个阈值。

所以,cardinality 很适合用于:

  • 统计网站的访问设备/IP 数量
  • 统计不同产品的数量
  • 统计不同用户的数量

它可以提供近实时的统计,对性能影响很小。

小结

利用bucket_sort来分页,cardinality来获取total


第二步 分页并支持模糊查询

方式一 query 方式

GET attack/_search
{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              {
                "match_phrase": {
                  "host_userName": "guo"
                }
              },
              {
                "match_phrase": {
                  "host_ip": "192.168.198.132"
                }
              }
            ]
          }
        },
        {
          "bool": {
            "filter": [
              {
                "terms": {
                  "host_id": [
                    "f261cd4b-8922-4c1f-bb24-72eec4f4245c",
                    "89bd8783-9cbf-4c8d-9160-da4588ee73d7"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "getAlarmStatistByHostId": {
      "terms": {
        "field": "host_id",
        "size": 100000,
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "host_details": {
          "top_hits": {
            "size": 1,
            "_source": {
              "include": [
                "host_id",
                "host_userName",
                "host_orgPath",
                "host_ip",
                "host_mac"
              ]
            }
          }
        },
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 2,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
        "field": "host_id",
        "precision_threshold": 40000
      }
    }
  }
}


返回

{
  "took" : 19,
  "timed_out" : false,
  "_shards" : {
    "total" : 8,
    "successful" : 8,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "getAlarmStatistByHostId" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "f261cd4b-8922-4c1f-bb24-72eec4f4245c",
          "doc_count" : 10,
          "host_details" : {
            "hits" : {
              "total" : {
                "value" : 10,
                "relation" : "eq"
              },
              "max_score" : 9.781191,
              "hits" : [
                {
                  "_index" : "zfattack-202305",
                  "_type" : "_doc",
                  "_id" : "b19af55c-33ec-4e50-93c2-8ae028d96c5c",
                  "_score" : 9.781191,
                  "_source" : {
                    "host_ip" : "192.168.198.132",
                    "host_mac" : "00-0C-29-CA-E9-4C",
                    "host_orgPath" : """112赣州\ztj单位\ztj部门""",
                    "host_userName" : "guo",
                    "host_id" : "f261cd4b-8922-4c1f-bb24-72eec4f4245c"
                  }
                }
              ]
            }
          }
        }
      ]
    },
    "termsCount" : {
      "value" : 1
    }
  }
}


方式二: 脚本

GET zfattack-*/_search
{
  "size": 0,
  "query": {
    "match_all": {}
  },
  "aggs": {
    "getAlarmStatistByHostId": {
      "terms": {
        "script": {
          "source": "if(doc['host_id'].value.contains('f261cd4b-8922-4c1f-bb24-72eec4f4245c')) {doc['host_id'].value }"
        },
        "size": 100000,
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "host_details": {
          "top_hits": {
            "size": 1,
            "_source": {
              "include": [
                "host_id",
                "host_userName",
                "host_orgPath",
                "host_ip",
                "host_mac"
              ]
            }
          }
        },
        "myBucketSort": {
          "bucket_sort": {
            "from": 0,
            "size": 2,
            "gap_policy": "SKIP"
          }
        }
      }
    },
    "termsCount": {
      "cardinality": {
        "script": {
          "source": "if(doc['host_id'].value.contains('f261cd4b-8922-4c1f-bb24-72eec4f4245c')) {doc['host_id'].value }"
        },
        "precision_threshold": 40000
      }
    }
  }
}

返回

#! Deprecation: Deprecated field [include] used, expected [includes] instead
{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 8,
    "successful" : 8,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 10,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "getAlarmStatistByHostId" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "f261cd4b-8922-4c1f-bb24-72eec4f4245c",
          "doc_count" : 10,
          "host_details" : {
            "hits" : {
              "total" : {
                "value" : 10,
                "relation" : "eq"
              },
              "max_score" : 1.0,
              "hits" : [
                {
                  "_index" : "zfattack-202305",
                  "_type" : "_doc",
                  "_id" : "7b761eaa-8b65-4608-b3d9-89a82c9b1784",
                  "_score" : 1.0,
                  "_source" : {
                    "host_ip" : "192.168.198.132",
                    "host_mac" : "00-0C-29-CA-E9-4C",
                    "host_orgPath" : """112赣州\ztj单位\ztj部门""",
                    "host_userName" : "guo",
                    "host_id" : "f261cd4b-8922-4c1f-bb24-72eec4f4245c"
                  }
                }
              ]
            }
          }
        }
      ]
    },
    "termsCount" : {
      "value" : 1
    }
  }
}

cardinality 的 script

可以通过 cardinality 的 script 参数来达到过滤的效果。
语法是:

"cardinality": {
  "field": "field_name",
  "script": "condition" 
}

这会统计 field_name 字段中满足 script 条件的基数。
例如,有文档:

{ "age": 10 } 
{ "age": 20 }
{ "age": 30 }
{ "age": 40 }

如果我们要统计 age > 30 的基数,可以使用:

"cardinality": {
  "field": "age",
  "script": "doc['age'].value > 30" 
}

这会返回 2,因为只有 age = 40 的文档满足条件。
再比如,要统计同时满足 age > 30 和 gender = “male” 的用户基数,可以使用:

"cardinality": {
  "field": "age",  
  "script": "doc['age'].value > 30 && doc['gender'].value == 'male'" 
}

这里的 script 使用 Elasticsearch 的 Painless 脚本语言,可以非常灵活地设置过滤逻辑。
所以,通过 script 参数,我们可以实现一些过滤条件,然后统计满足这些条件的字段基数,这给我们带来很大灵活性。

除了 cardinality 聚合,在 termsCount 查询中也可以使用 script 过滤:

"termsCount": {
  "cardinality": {
    "field": "age",
    "script": "doc['age'].value > 30" 
  }
}

这会返回一个 filtered 基数,代表 age 大于 30 的值有多少个。
所以 script 参数让 cardinality 和 termsCount 变得更加强大和灵活。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.100ASK_V853-PRO开发板支持4寸MIPI屏

0.前言 ​ 由于之前我们已经适配过RGB屏,如果我们去适配了4寸MIPI屏,那么RGB屏就不能使用了。对于4寸屏购买链接为: 百问网4寸MIPI屏 LCD_调试指南:https://tina.100ask.net/SdkModule/Linux_LCD_DevelopmentGuide-01/ Display_开发指南:h…

pmp学习对职场的影响有多大?

不知不觉,2021的进度条已经走过了一半。行业政策的变化,岗位的能力对比,都让职场竞争变得更加激烈,成为一名优秀且具有竞争力的项目经理好像变得越来越难了。 为什么这样说呢?因为各行各业在对PM要求各项专业技能的同…

ChatGPT人工智能聊天机器人的优势与应用

当今社会,聊天机器人(Chatbot)已经成为一种新的交互方式。而ChatGPT则是一种基于深度学习技术的聊天机器人,它可以模拟人类对话的过程,可以为人们提供快速、便捷的解决方案。以下是ChatGPT的简介和优势: 基本信息:Chat…

将区块链技术融入电梯管理系统

电梯管理系统 电梯是人们日常生活和工作中必不可少的交通工具,为了保障电梯的安全性和运营效率,需要实时监测电梯状态及事件/故障。这里可以查考网络上提供的方案,在电梯内部安装了各种各样的传感器,通过网关将收集到的数据上传到…

小红书保姆级投放指南 | 助力引爆618

5月到来,618营销正式进入放量冲刺期,作为年中重量级营销节点,各大品牌角逐激烈。 本期千瓜推出618投放指南,助力品牌在冲刺期抢占用户心智、抓住高转化周期流量,打赢这场无硝烟之战。整体节奏把控四个阶段循序渐进 品牌…

Acrel-2000系列监控系统在亚运手球比赛馆建设10kV供配电工程中的应用

安科瑞 耿敏花 摘要:智能化配电监控系统是数字化和信息化时代应运而生的产物,已经被广泛应用于电网用户侧楼宇、体育场馆、科研设施、机场、交通、医院、电力和石化行业等诸多领域的高/低压变配电系统中。安科瑞自研的Acrel-2000系列监控系统可监控高压开关柜、低压…

第八章 SSM整合

1.整合关键点 Spring:负责对象的创建、维护、管理及对象依赖资源的注入 SpringMVC:负责请求的处理相当于(Servlet) MyBatis:负责与数据库进行交互 2.整合步骤 2.1.在pom.xml文件中导入依赖 mybatis、spring-webmvc、mybatis-spring、bonecp数…

GIF动态图录制工具

大家好,我是小寻,欢迎关注公众号:工具优选,免费领取优质项目源码和常用工具,还可以加入我的交流群! 一、工具介绍 Screen to Gif中文版是一款方便可靠的gif动画录制软件,可以用来快速录制屏幕上的指定区域&#xff…

二十年前的老游戏,为何再次让无数程序员痴迷不已?

SpaceTraders是个古老的策略类游戏,运行在古老的Palm OS和Windows Mobile PDA上。 游戏开始时,玩家将获得一艘飞船,然后驾驶它在各个星球之间穿梭,挖掘星球矿产,低买高卖赚取利润,赚了钱可以升级飞船&#…

麻了,一个操作把MySQL主从复制整崩了

最近公司某项目上反馈mysql主从复制失败,被运维部门记了一次大过,影响到了项目的验收推进,那么究竟是什么原因导致的呢?而主从复制的原理又是什么呢?本文就对排查分析的过程做一个记录。 主从复制原理 我们先来简单了…

淘宝商品详情接口 淘宝商品库存接口 淘宝商品销量接口 淘宝商品sku信息接口 淘宝商品优惠价接口

淘宝商品详情API接口item_get是一个非常重要的API接口,它可以获取淘宝商品的详细信息。对于淘_宝卖家来说,通过调用该接口可以实现对自己商品信息的获取、修改和管理等功能。 使用item_get接口可以获取一个商品的所有信息,包括商品的标题、价…

[学习笔记] [机器学习] 4. [上]线性回归(正规方程、梯度下降、岭回归)

视频链接数据集下载地址:无需下载 本文学习目标: 掌握线性回归的实现过程应用LinearRegression或SGDRegressor实现回归预测知道回归算法的评估标准及其公式知道过拟合与欠拟合的原因以及解决方法知道岭回归的原理及与线性回归的不同之处应用Ridge实现回…

这次彻底不需要账号了,无需魔法永久白嫖GPT

免费GPT 自GPT风靡以来,大家用的是不亦乐乎,你用他去解决过实际问题,你用他去写过代码,你用他去修改过bug,你用他去写过sql,你用他去画过图,你问过他你能想到的任何“刁钻”问题。 你&#xff…

如何在没有密码的情况下解锁华为手机

华为手机用户通常会使用密码保护他们的设备免受未经授权的访问。但是当用户忘记密码时就会出现问题。如果您无法回忆起密码,可以选择重置手机。但是有更多更好的方法可以帮助您解锁华为手机。在本文中,我们将向您展示如何免密码解锁华为手机。按照本文&a…

“五位一体”打造数字业务安全体系

顶象联合中国信通院发布的《业务安全白皮书—数字业务风险与安全》显示,随着数字化的发展,企业的关键数据、用户信息、基础设施、运营过程等均处于边界模糊且日益开放的环境中,涉及利益流和高附加值的业务面临多样的安全隐患;同时…

Linux下最强安卓模拟器,流畅又丝滑(附详细安装教程)此瓜保熟|Linux游戏党

我打算完全从头开始,写一个专门用于桌面办公的纯国产操作系统 ,规避主流操作系统上影响用户体验的问题,系统力求简洁。有兴趣加QQ群:709652950 好东西让更多人发现!我找了整整两年,什么Anbox,什…

【必知必懂论文】之多模态实体识别

引言 命名实体识别(NER)是自然语言处理(NLP)领域中的最基础、最核心的任务之一,该任务旨在识别出文本中的命名实体(通常指特定类型事物的名称或符号,一般是一个名词或者短语),并将识别出的实体…

【这七款网工在线画拓扑工具,你会用几个呢?】

其实绘制拓扑图的工具有很多,今天主要推荐给大家7款在线的绘图软件,不仅好用,不占内存,而且功能强大。 看看有没有你种草的那一款哈,当然,如果有其他更好用的工具,也欢迎留言区告诉其他网工朋友…

apifm-wxapi

文章目录 apifm-wxapi介绍为什么要用 apifm-wxapi使用1. 项目导入 apifm-wxapi2. 平台注册3. 平台配置4. 用户注册5. 用户登录6. 使用其他API 【参考】 apifm-wxapi 介绍 “微信小程序接口工具包,无需服务器,无需开发后台,开箱即用&#xf…

(四)运行微信小程序:在主页加入表单组件实现提交功能

我们在上个小练习的基础上,继续在主页添加功能——使用表单组件form。 根据微信官方文档: https://developers.weixin.qq.com/miniprogram/dev/component/form.html 当需要获取用户提交的信息时,可以使用表单组件form。当用户点击表单中fo…