当前位置: 首页 > article >正文

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

#### 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.kler.cn/a/465331.html

相关文章:

  • 若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)
  • Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能
  • 法律专业legal case的留学论文写作技巧分析(1)
  • MetaGPT - 多Agent框架
  • Eplan 项目结构(高层代号、安装地点、位置代号)
  • Java SpringBoot使用Apache POI导入导出Excel文件
  • 面向对象三大特征之一——继承super
  • Sentinel的源码学习记录
  • 服务器主机网络测试命令
  • 2024 年终总结
  • 数据篇---用python创建想要的xml
  • [python SQLAlchemy数据库操作入门]-21.SQLAlchemy Session生命周期管理:保持数据持久化
  • 网络安全 | 防护层次:从物理到应用的多重保障
  • 【2025年最新】OpenWrt 更换国内源的指南(图形界面版)
  • C# OpenCV机器视觉:非刚性物体跟踪
  • 算法基础五:归并排序
  • 边沿检测电路漏检原因分析
  • Ubuntu--安装搜狗输入法
  • pip下载包出现SSLError
  • 面试提问:Redis为什么快?
  • 使用MediaPipe Face Mesh 面部动作检测
  • ElasticSearch备考 -- 整体脉络梳理
  • 【SQL】进阶知识 -- SQL创建表的几种方法
  • 影刀进阶指令 | Kimi (对标ChatGPT)
  • 通过爬虫方式实现视频号助手发布视频
  • GICv2与GICv3中断架构对比与LPI中断机制分析