#### 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