es 3期 第19节-运用异步机制执行重度查询

news2025/1/3 14:03:34

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
#### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!

##### 索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
##### 对历史数据无效!!!!
##### 一定要重建索引!!!!

### 1、async search 异步查询需求背景
## 重度查询问题
# 重度查询概念介绍
# 重度查询查询计算量比较大
# 执行查询需要占用很大资源
# 执行查询消耗时间很长,数秒以上
# 执行查询并发度并不高,甚至无并发
# 所有的数据产品都不能即数据量大,又支持高并发度查询或者统计
 
# 重度查询四个问题:IO消耗大、并发度低、计算量大、执行时间长

## 重度查询解决方案
# 异步调度job
# 执行查询计算
# 查询结果存储起来
# 通知外部查询


### 2、异步查询背后原理
## 异步任务管理
# asyncsearch:异步查询命令
# 异步任务执行,记录异步任务元信息

# 发起异步查询 -> 记录异步元信息 -> 返回异步元信息

## 异步查询数据存储
# 异步执行之后,会将数据存储在一个内置索引中
# 存储索引:/.async-search


## 准备数据,多执行几遍,最好有三五百万以上数据

POST _reindex
{
  "source": {
    "index": "kibana_sample_data_logs_page"
  },
  "dest": {
    "index": "kibana_sample_data_logs_async_search"
  },
  // 重新生成id
  "script": {
    "source": """ctx._id = UUID.randomUUID().toString();
    ctx._source.request=ctx._source.timestamp;"""
  }
}

### 3、异步查询实战

GET kibana_sample_data_log*/_search
{
  "track_total_hits":true
}

# 写一个聚合查询,这里数据量太少,很快就执行完了,就当它比较慢吧

 

GET kibana_sample_data_log*/_search
{
  "track_total_hits":true,
  "size":0,
  "aggs":{
    // 自定义聚合的字段名
    "timestamp":{
      "date_histogram": {
        "field": "timestamp",
        // 时间维度 1d
        "fixed_interval": "1d"
      },
      // 在每天的维度下统计ip的数量
      "aggs": {
        "url": {
          "terms": {
            "field": "clientip.keyword",
            "size": 200
          },
          "aggs": {
            "ip": {
              "terms": {
                "field": "ip.keyword",
                "size": 200
              },
              "aggs": {
                "host": {
                  "terms": {
                    "field": "host", 
                    "size": 10
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

## 创建异步查询任务
# 数据少很快就查出来了,加个等待时间参数 wait_for_completion_timeout
# Post /索引信息/_asyncsearch

POST kibana_sample_data_log*/_async_search?wait_for_completion_timeout=100ms
{
  "track_total_hits":true,
  "size":0,
  "aggs":{
    // 自定义聚合的字段名
    "timestamp":{
      "date_histogram": {
        "field": "timestamp",
        // 时间维度 1d
        "fixed_interval": "1d"
      },
      // 在每天的维度下统计ip的数量
      "aggs": {
        "ip": {
          "terms": {
            "field": "ip.keyword",
            "size": 200
          },
          "aggs": {
            "request": {
              "terms": {
                "field": "request.keyword",
                "size": 200
              }
            }
          }
        }
      }
    }
  }
}

## 查询结果,数据量一定要多,不然结果就直接出来了
# {
#   // 异步任务id,主要关注这个就可以了
#   "id": "FmJfbWtidkRDUngtakNwRkpPQkJmQnceQ2Z1bWNMdEJSNEctd1VDaGdwcDlOdzo2NjUzODAz",
#   // 是不是局部的
#   "is_partial": true,
#   // 后台正在运行
#   "is_running": true,
#   // 开始时间
#   "start_time_in_millis": 1735223869593,
#   // 过期时间
#   "expiration_time_in_millis": 1735655869593,
#   "response": {
#     "took": 1008,
#     "timed_out": false,
#     "terminated_early": false,
#     // 执行了多少次
#     "num_reduce_phases": 0,
#     "_shards": {
#       // 查了多少个分片
#       "total": 3,
#       "successful": 0,
#       "skipped": 0,
#       "failed": 0
#     },
#     "hits": {
#       "total": {
#         "value": 0,
#         "relation": "gte"
#       },
#       "max_score": null,
#       "hits": []
#     }
#   }
# }

## 查询异步任务状态
# 异步查询元信息
# ID:异步查询任务ID

# 任务id查询任务数据

GET _async_search/FkRmemkyVE05UTMyOXJsemJEWUlvYXceQ2Z1bWNMdEJSNEctd1VDaGdwcDlOdzo3NTg2Mzcz

## Request 请求参数
# Request Url 请求参数
# request_cache,是否启用缓存,默认true
# keep_alive,异步查询执行结果有效时间,默认时间5d
# batched_reduce size,控制分片查询响应数,默认5,无需要等待所有分片执行查询完成,即可执行查询结果合并;在同步查询中,默认512,控制的是数据条数
# ccs_minimize_roundtrips,跨集群查询支持,默认 false
# wait_for_completion_timeout,等待超时时间,默认 1s,如果是 1s内返回结果,则直接返回结果;相反,则会返回异步任务元数据信息


## 数据存储
# 异步查询数据存储
# 异步执行之后,会将数据存储在一个内置索引中存储索引:/.async-search
# 所以使用的时候要注意存储空间
 

# 查询索引结构
GET .async-search
# 查询索引中的数据(注意,数据多kibana会卡)
GET .async-search/_search

## 查询异步状态
# status ,查询状态参数
# completion_status,查询状态返回的状态值,数值类型200=完成
# 重度查询可用这个检查状态

GET _async_search/status/FkRmemkyVE05UTMyOXJsemJEWUlvYXceQ2Z1bWNMdEJSNEctd1VDaGdwcDlOdzo3NTg2Mzcz

## 响应结果
# {
#   "id": "FkRmemkyVE05UTMyOXJsemJEWUlvYXceQ2Z1bWNMdEJSNEctd1VDaGdwcDlOdzo3NTg2Mzcz",
#   "is_running": false,
#   "is_partial": false,
#   "start_time_in_millis": 1735565559893,
#   "expiration_time_in_millis": 1735997559893,
#   "_shards": {
#     "total": 3,
#     "successful": 3,
#     "skipped": 0,
#     "failed": 0
#   },
#   "completion_status": 200
# }

## 删除异步任务
# 异步任务结果,默认存储 5day,之后自动删除
# 若结果数据量多,建议人工手动删除

DELETE _async_search/FkRmemkyVE05UTMyOXJsemJEWUlvYXceQ2Z1bWNMdEJSNEctd1VDaGdwcDlOdzo3NTg2Mzcz

### 4、search template 查询模板
# 查询模板是一种开发便利手段,类同传统数据库的存储过程与函数
# 查询模板也是一种查询效率提升的手段,类同存储过程与动态 SOL脚本的区别

## 查询模版实战

## 单模板查询
# template,查询API入国
# source,查询表达式入口,基于mustache语法方式
# params,查询参数

# 简单查询
GET kibana_sample_data_flights/_search
{
  "query":{
    "match": {
      "DestCountry": "CN"
    }
  }
}
# 查询模版,与上面的查询等价
GET kibana_sample_data_flights/_search/template
{
  "source": {
    "query": {
      "match": {
        "{{key_1}}": "{{value_1}}"
      }
    }
  },
  "params": {
    "key_1": "DestCountry",
    "value_1": "CN"
  }
}

## 查询模板存储
# 查询参数
# scripts,创建查询模板存储 API
# kibana_sample_data flights tp01,查询模板名称,必须唯
# script,查询模板表达式入口
# source,查询表达式内容
# id,查询模板名称
 

# 配置查询模版,模版名为temp01
POST _scripts/temp01
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "{{key_1}}": "{{value_1}}"
        }
      }
    }
  }
}
# 使用查询模版
GET kibana_sample_data_flights/_search/template
{
  "id":"temp01",
  "params": {
    "key_1": "DestCountry",
    "value_1": "CN"
  }
}

## 管理存储查询模板

# 查询已经创建的查询模板
GET _scripts/temp01
# 删除
DELETE _scripts/temp01

## 验证查询模板
# 查询参数
# _render,验证查询模板的生成语法

# 临时验证模版
GET _render/template
{
  "source": {
    "query": {
      "match": {
        "{{key_1}}": "{{value_1}}"
      }
    }
  },
  "params": {
    "key_1": "DestCountry",
    "value_1": "CN"
  }
}

# 验证存储的查询模版

# 重新创建一个末班temp02
POST _scripts/temp02
{
  "script": {
    "lang": "mustache",
    "source": {
      "query": {
        "match": {
          "{{key_1}}": "{{value_1}}"
        }
      }
    }
  }
}
GET _render/template/temp02
{
  "params": {
    "key_1": "DestCountry",
    "value_1": "CN"
  }
}

## Mustache 运用
# 查询参数
# 运用 Mustache 高级语法
# 案例练习
# 使用 mustache 的 json 转换方式,动态的构造json 查询语法;查询目的地国家包括2个其中任意一个

# 原查询语句
GET kibana_sample_data_flights/_search
{
  "track_total_hits":true,
  "query":{
    "terms": {
      "DestCountry": ["GB","CN"]
    }
  }
}
# 高级mustache查询语句
GET kibana_sample_data_flights/_search/template
{
  "source":"{\"query\":{\"terms\":{{#toJson}}DestCountryList{{/toJson}} }}",
  "params": {
    // DestCountryList是参数名
    "DestCountryList": {
      "DestCountry":["GB","CN"]
    }
  }
}

## 多查询搜索
# 查询参数
# 部分应用场景下,需要一次执行多种不同的查询条件,便于数据对比
# msearch,多个查询并行关键字

GET _msearch
{"index":"kibana_sample_data_flights"}
{"query":{"term":{"DestCountry":"GB"}}}
{"index":"kibana_sample_data_flights"}
{"query":{"term":{"DestCountry":"CA"}}}

## 多模板查询
# 查询参数
# 多模板查询,在多查询搜索基础之上
# _msearch/template

GET _msearch/template
{"index":"kibana_sample_data_flights"}
{"id":"temp01","params":{"key_1": "DestCountry","value_1": "GB"}}
{"index":"kibana_sample_data_flights"}
{"id":"temp01","params":{"key_1": "DestCountry","value_1": "CN"}}

### 5、异步查询建议以及经验分享
## 异步查询应用场景的选择
## 即时处理异步查询的任务(用完删除)
## EQL也支持异步查询

# async-search 异步查询
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/async-search.html
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/async-search-intro.htm
# search-template 查询模板
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-template.html
# Mustache 模板语法
# http://mustache.github.io/http://mustache.github.io/mustache.5.html

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

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

相关文章

XIAO Esp32S3 播放网络Mp3

本文旨在使用XIAO Esp32S3 播放网络Mp3 所需硬件 max98357 接线 Xiao Esp32 S3Max983574LRC5BCLK 6DIN5VVinGNDGND代码: #include "Arduino.h" #include "WiFiMulti.h" #include "Audio.h"// Digital I/O used #def

智能边缘计算×软硬件一体化:开启全场景效能革命新征程(高校开发者作品)

边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…

ubuntu22 安装CUDA

在Ubuntu系统中,使用nvidia-smi命令可以看到当前GPU信息,在右上角可以看到CUDA Version,意思是最大支持的CUDA版本号。 安装下载 CUDA Toolkit 11.6 Downloads | NVIDIA Developer https://developer.nvidia.com/cuda-downloads?target_osL…

VectorCAST入门指导

文章目录 1. VectorCAST 概述2. 启动 VectorCAST(Windows用户)2. 故障排除3. VectorCAST 界面4. 创建一个 VectorCAST 项目5. 设置工作目录6. 创建一个新项目7. 添加一个单元测试环境8. 添加测试用例9. 执行所有测试1. VectorCAST 概述 VectorCAST是一套测试自动化工具: Vecto…

12.30 linux 文件操作,磁盘分区挂载

ubuntu 在linux 对文件的相关操作【压缩,打包,软链接,文件权限】【head,tail,管道符,通配符,find,grep,cut等】脑图-CSDN博客 1.文件操作 在家目录下创建目录文件&#…

Zabbix 监控平台 添加监控目标主机

Zabbix监控平台是一个企业级开源解决方案,用于分布式系统监视和网络监视。它由Zabbix Server和可选组件Zabbix Agent组成,通过C/S模式(客户端-服务器模型)采集数据,并通过B/S模式(浏览器-服务器模型&#x…

第10章 初等数论

2024年12月27日一稿(P341) 2024年12月28日二稿 2024年12月29日三稿 当命运这扇大门向你打开的时候,不要犹豫和害怕,一直往前跑就是了! 10.1 素数 这里写错了,不能整除应该表示为 10.2 最大公约数与最小公…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中,拿到数据后首先要对数据进行清洗,把数据变成咱们想要的格式,才能进行下一步分析,其中数据中的字符转成数字是个重要的内容,因为字符中常含有特殊符号,不利于分析,转成数字后才能…

微信流量主挑战:三天25用户!功能未完善?(新纪元4)

🎉【小程序上线第三天!突破25用户大关!】🎉 嘿,大家好!今天是我们小程序上线的第三天,我们的用户量已经突破了25个!昨天还是16个,今天一觉醒来竟然有25个!这涨…

Ps:将数据组作为文件导出

Ps菜单:文件/导出/数据组作为文件 Export/Data Sets as Files “将数据组作为文件导出” Export Data Sets as Files命令是 Photoshop 数据驱动设计功能的一部分,用于结合可变数据和模板,生成多个文件。 1、自动化批量生成 适用于名片、证书、…

Java基本操作笔记

命令行快速进入指定文件夹 快速切换进入指定文件 文件夹快速切换 idea开发步骤 快捷键 修改模块 选中模块右键依次选择 选择第三个修改模块和文件夹的名称 输入修改后的名字回车 导入模块 找到要导入的模块,ctrc复制该文件夹 打开idea找到工程文件夹ctrv粘贴 点击o…

OpenCV-Python实战(8)——图像变换

一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img:目标图像。 src:原始图像。 dsize:(width,height)图像大小。 fx、fy:可选参数,水平/垂直方向…

Spring thymeleaf 的快速默认搭建使用

Spring thymeleaf 的快速默认搭建使用 thymeleaf 的搭建Pom 文件 thymeleaf 的使用Controller返回参数String资源文件路径访问端点显示HTML页面 thymeleaf 的搭建 Pom 文件 Pom 文件引入 spring-boot-starter-thymeleaf 依赖 <dependency><groupId>org.springfra…

Linux | 零基础Ubuntu搭建JDK

目录 软件简介 在线文档 压缩包安装 下载地址 补:传输软件 传输等待 目录结构 解压安装 配置环境 更新环境 测试JDK结果 APT安装 软件简介 Java Development Kit (JDK) 是 Sun 公司&#xff08;已被 Oracle 收购&#xff09;针对 Java 开发员的软件开发工具包。自…

揭秘 Fluss 架构组件

这是 Fluss 系列的第四篇文章了&#xff0c;我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署&#xff0c;带领大家部署Fluss 环境&#xff0c;体验一下 Fluss 的功能Fluss 整合数据湖的操作&#xff0c;体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…

PyQt的介绍

举例 解释 一 PyQt是什么 PyQt 是 Python 编程语言的一个库&#xff0c;它是 Qt 库的 Python 绑定。Qt 是一个跨平台的图形用户界面&#xff08;GUI&#xff09;开发框架&#xff0c;广泛应用于开发桌面应用程序。PyQt 使得 Python 开发者能够利用 Qt 框架的强大功能来创建图…

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部&#xff0c;构成了一个帧。接收端在收到物理层上交的比特流后…

SAP SD信贷管理信用管理手册(下)

1、项目类别的信贷激活 图1-12-1.项目类别的信贷设置路径 图1-12-2.项目类别的信贷参数激活 说明&#xff1a;项目类别是否进行信贷管理设置。 2、定义信贷组 图1-13-1.定义信贷组路径 图1-13-2.信贷组定义 说明&#xff1a;信贷组参与后续信贷控制的组合分配。 3、销售凭证及…

【linux学习指南】可重入函数与volatile

文章目录 &#x1f4dd;可重⼊函数&#x1f320; volatile&#x1f6a9;总结 &#x1f4dd;可重⼊函数 main函数调⽤insert函数向⼀个链表head中插⼊节点node1,插⼊操作分为两步,刚做完第⼀步的时候,因为硬件中断使进程切换到内核,再次回⽤⼾态之前检查到有信号待处理,于是切换…