Elasticsearch - EQL;SQL(十三)

这篇具有很好参考价值的文章主要介绍了Elasticsearch - EQL;SQL(十三)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、EQL

(一)EQL简介

EQL 的全名是 Event Query Language (EQL)。事件查询语言(EQL)是一种用于基于事件的时间序列数据(例如日志,指标和跟踪)的查询语言。EQL 在 Elastic Security 中被广泛使用。在 Elastic Security 平台上,当输入有效的 EQL 时,查询会在数据节点上编译,执行查询并返回结果。这一切都快速、并行地发生,让用户立即看到结果

es eql,Elasticsearch,Elasticsearch,EQL,DataGrip,NLP

EQL优点

1、EQL 使你可以表达事件之间的关系

许多查询语言允许匹配单个事件,EQL可以匹配不同事件类别和时间跨度的一系列事件

2、EQL 的学习曲线很低

EQL 语法看起来像其他常见查询语言,例如 SQL

EQL 使你可以直观地编写和读取查询,从而可以进行快速,迭代的搜索

3、EQL 设计用于安全用例

尽管可以将其用于任何基于事件的数据,但我们创建了 EQL 来进行威胁搜寻。 EQL不仅支持危害指标(IOC)搜索,而且可以描述超出 IOC 范围的活动

(二)EQL语法

1、基础语法

要运行 EQL 搜索,搜索到的数据流或索引必须包含时间戳事件类别字段

默认情况下,EQL 使用 Elastic 通用模式(ECS)中的 @timestamp 和 event.category 字段

@timestamp 表示时间戳,event.category 表示事件分类

1、准备数据:电商网站页面跳转

# 创建索引
PUT /gmall
# 批量增加数据
PUT _bulk
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:00:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "","page_id" : 
"login","user_id" : ""}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:01:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "login","page_id" : 
"good_list","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:05:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "good_list","page_id" : 
"good_detail","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:07:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : 
"good_detail","page_id" : "order","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:08:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125101","last_page_id" : "order","page_id" : 
"payment","user_id" : "1"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:08:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125102","last_page_id" : "","page_id" : 
"login","user_id" : "2"}}
{"index":{"_index":"gmall"}}
{"@timestamp":"2022-06-01T12:08:00.00+08:00", 
"event":{"category":"page"},"page" : {"session_id" : 
"42FC7E13-CB3E-5C05-0000-0010A0125102","last_page_id" : "login","page_id" : 
"payment","user_id" : "2"}}

2、数据搜索

使用一种名为 any 的特殊事件类型,针对所有事件进行匹配,如果想要匹配特定事件,就需要指明事件分类名称

# 
GET /gmall/_eql/search
{
 "query" : """
 any where page.user_id == "1"
 """
}

3、统计符合条件的事件

# 
GET /gmall/_eql/search
{
 "query" : """
 any where true
 """,
 "filter": {
 "range": {
 "@timestamp": {
 "gte": "1654056000000",
 "lt": "1654056005000"
 }
 }
 } }

4、事件序列

# 页面先访问 login,后面又访问了 good_detail 的页面
GET /gmall/_eql/search
{
 "query" : """
 sequence by page.session_id
 [page where page.page_id=="login"]
 [page where page.page_id=="good_detail"]
 """
}

2、安全监测

EQL 在 Elastic Securit 中被广泛使用

1、数据准备

regsvr32.exe 是一个内置的命令行实用程序,用于在 Windows 中注册.dll 库。作为本机工具,regsvr32.exe 具有受信任的状态,从而使它可以绕过大多数允许列表软件和脚本阻止程序。 有权访问用户命令行的攻击者可以使用 regsvr32.exe 通过.dll 库运行恶意脚本,即使在其他情况下也不允许这些脚本运行

regsvr32 滥用的一种常见变体是 Squfullydoo 攻击

在 Squfullydoo 攻击中,regsvr32.exe 命令使用 scrobj.dll 库注册并运行远程脚本

测试数据来自 Atomic Red Team 的测试数据集,其中包括模仿 Squibledoo 攻击的事件。数据已映射到 Elastic 通用架构(ECS)字段:normalized-T1117-AtomicRed-regsvr32.json

将文件内容导入到 ES 软件中

# 创建索引
PUT my-eql-index
# 导入数据
POST my-eql-index/_bulk?pretty&refresh
# 导入数据
GET /_cat/indices/my-eql-index?v=true&h=health,status,index,docs.count

2、获取 regsvr32 事件的计数

# 查询数据
# ?filter_path=-hits.events 从响应中排除 hits.events 属性。 此搜索仅用于获取事件计数,
而不是匹配事件的列表
# query : 匹配任何进程名称为 regsvr32.exe 的事件
# size : 最多返回 200 个匹配事件的匹配,实际查询结果为 143 个
GET my-eql-index/_eql/search?filter_path=-hits.events
{
 "query": """
 any where process.name == "regsvr32.exe" 
 """,
 "size": 200 
}

3、 检查命令行参数

# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{
 "query": """
 process where process.name == "regsvr32.exe" and 
process.command_line.keyword != null 
 """
}

该查询将一个事件与创建的 event.type 相匹配,指示 regsvr32.exe 进程的开始。根据事件的 process.command_line 值,regsvr32.exe 使用 scrobj.dll 注册了脚本 RegSvr32.sct.这符合 Squibledoo 攻击的行为

4、检查恶意脚本加载

# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{
 "query": """
 library where process.name == "regsvr32.exe" and dll.name == "scrobj.dll" 
 """ 
}

5、检查攻击成功可能性 

在许多情况下,攻击者使用恶意脚本连接到远程服务器或下载其他文件

使用 EQL 序列查询来检查以下一系列事件:

(1)regsvr32.exe 进程

(2)通过相同的进程加载 scrobj.dll 库

(3) 同一过程中的任何网络事件

根据上一个响应中看到的命令行值,你可以期望找到一个匹配项。但是,此查询并非针对该特定命令而设计。取而代之的是,它寻找一种可疑行为的模式,这种模式足以检测出相似的威胁

# 增加过滤条件查询数据
GET my-eql-index/_eql/search
{
 "query": """
 sequence by process.pid
 [process where process.name == "regsvr32.exe"]
 [library where dll.name == "scrobj.dll"]
 [network where true] 
 """ 
}

二、SQL

一般使用 Elasticsearch 的时候,会使用 Query DSL 来查询数据,从 Elasticsearch6.3 版本以后,Elasticsearch 已经支持 SQL 查询了。

Elasticsearch SQL 是一个 X-Pack 组件,它允许针对 Elasticsearch 实时执行类似 SQL 的查询。无论使用 REST 接口,命令行还是 JDBC,任何客户端都可以使用 SQL 对 Elasticsearch中的数据进行原生搜索和聚合数据。可以将 Elasticsearch SQL 看作是一种翻译器,它可以将SQL 翻译成 Query DSL

Elasticsearch SQL 具有如下特性:

(1)原生支持:Elasticsearch SQL 是专门为 Elasticsearch 打造的

(2)没有额外的零件:无需其他硬件,处理器,运行环境或依赖库即可查询 Elasticsearch,Elasticsearch SQL 直接在 Elasticsearch 内部运行

(3)轻巧高效:Elasticsearch SQL 并未抽象化其搜索功能,相反的它拥抱并接受了 SQL 来实现全文搜索,以简洁的方式实时运行全文搜索

(一)SQL 和 Elasticsearch 的对应关系

SQL Elasticsearch 描述
Column
field
对比两个,数据都存储在命名条目中,具有多种数据类型,包含一
个值。SQL 将此类条目称为列,而 Elasticsearch 称为字段。请注意,
在 Elasticsearch 中,一个字段可以包含多个相同类型的值(本质上
是一个列表),而在 SQL 中,一个列可以只包含一个所述类型的
值。Elasticsearch SQL 将尽最大努力保留 SQL 语义,并根据查询拒
绝那些返回具有多个值的字段的查询
Row Document
Columns 和 fields 本身不存在;它们是 row 或 a 的一部分 document。
两者的语义略有不同:row 趋于严格(并且有更多的强制执行),而
document 趋于更加灵活或松散(同时仍然具有结构)
Table Index 执行查询的目标
Schema Mapping
在 RDBMS 中,schem 主要是表的命名空间,通常用作安全边界。
Elasticsearch 没有为它提供等效的概念。但是,当启用安全性时,
Elasticsearch 会自动应用安全性强制,以便角色只能看到它被允许访
问的数据
Database Cluster实例
在 SQL 中,catalog 或者 database 从概念上可以互换使用,表示一组
模式,即多个表。在 Elasticsearch 中,可用的索引集被分组在一个
cluster,语义也有所不同。database 本质上是另一个命名空间(可能
对数据的存储方式有一些影响),而 Elasticsearch cluster 是一个运
行时实例,或者更确切地说是一组至少一个 Elasticsearch 实例(通
常是分布式运行)。在实践中,这意味着虽然在 SQL 中,一个实
例中可能有多个目录,但在 Elasticsearch 中,一个目录仅限于一个

(二)数据准备

# 创建索引并增加数据,等同于创建表和数据
PUT my-sql-index/_bulk?refresh
{"index":{"_id": "JAVA"}}
{"name": "JAVA", "author": "zhangsan", "release_date": "2022-05-01", 
"page_count": 561}
{"index":{"_id": "BIGDATA"}}
{"name": "BIGDATA", "author": "lisi", "release_date": "2022-05-02", "page_count": 
482}
{"index":{"_id": "SCALA"}}
{"name": "SCALA", "author": "wangwu", "release_date": "2022-05-03", "page_count": 
604}

(三)SQL查询

# SQL
# 这里的表就是索引
# 可以通过 format 参数控制返回结果的格式,默认为 json 格式
# txt:表示文本格式,看起来更直观点.
# csv:使用逗号隔开的数据
# json:JSON 格式数据
# tsv: 使用 tab 键隔开数据
# yaml:属性配置格式
POST _sql?format=txt
{
 "query": """
 SELECT * FROM "my-sql-index"
 """
}


# 条件查询
POST _sql?format=txt
{
 "query": """
 SELECT * FROM "my-sql-index" where page_count > 500
 """
}

(四)SQL转为DSL

# 转换 SQL 为 DSL 进行操作
POST _sql/translate
{
 "query": """
 SELECT * FROM "my-sql-index" where page_count > 500
 """
}

(五)SQL和DSL混用

# SQL 和 DSL 混合使用
# 由于索引中含有横线,所以作为表名时需要采用双引号,且外层需要三个引号包含
POST _sql?format=txt
{
 "query": """SELECT * FROM "my-sql-index" """,
 "filter" : {
 "range": {
 "page_count": {
 "gte": 400,
 "lte": 600
 }
 }
 },
 "fetch_size": 2
}

(六) 常用SQL操作

1、查询所有索引

GET _sql?format=txt
{
 "query": """
 show tables
 """
}

2、查询指定索引

GET _sql?format=txt
{
 "query": """
 show tables like 'myindex'
 """
}

3、模糊查询索引

GET _sql?format=txt
{
 "query": """
 show tables like 'my-%'
 """
}

4、查看索引结构

GET _sql?format=txt
{
 "query": """
 describe myindex
 """
}

5、基础查询操作

# 基本 SQL 格式
SELECT select_expr [, ...]
[ FROM table_name ]
[ WHERE condition ]
[ GROUP BY grouping_element [, ...] ]
[ HAVING condition]
[ ORDER BY expression [ ASC | DESC ] [, ...] ]
[ LIMIT [ count ] ]
[ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ]

(1)where

# 条件过滤
POST _sql?format=txt
{
 "query": """ SELECT * FROM "my-sql-index" where name = 'JAVA' """
}

 (2)group by

# 查询所有数据
GET _sql?format=txt
{
 "query": """
 SELECT * FROM "my-sql-index" 
 """
}

# 按照日期进行分组
GET _sql?format=txt
{
 "query": """
 SELECT release_date FROM "my-sql-index" group by release_date
 """
}

(3)having

# 对分组后的数据进行过滤
GET _sql?format=txt
{
 "query": """
 SELECT sum(page_count), release_date as datacnt FROM "my-sql-index" group 
by release_date having sum(page_count) > 1000
 """
}

(4)order by

# 对页面数量进行排序(降序)
GET _sql?format=txt
{
 "query": """
 select * from "my-sql-index" order by page_count desc
 """
}

(5)limit

# 限定查询数量
GET _sql?format=txt
{
 "query": """
 select * from "my-sql-index" limit 3
 """
}

(6)cursor

游标(cursor)是系统为用户开设的一个数据缓冲区,存储 sql 语句的执行结果,每个游标区都有一个名字,用户可以用 sql 语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条或多条记录的机制

# 查询数据
# 因为查询结果较多,但是获取的数据较少,所以为了提高效果,会将数据存储到临时缓冲区中
# 此处数据展示格式为 json
POST _sql?format=json
{
 "query": """ SELECT * FROM "my-sql-index" order by page_count desc """,
 "fetch_size": 2
}
# 此处游标 cursor 值需要根据读者执行的操作进行修改,请勿直接使用
POST /_sql?format=json
{
 "cursor": 
"8/LoA0RGTABEissKgkAYRh2QiAh8FZVcuExKaWisxEbHTUzO7wVH7TKSb19Gi87ig8N3UIaeox/
IgdmjlQW0YLY7iICuhO9aIpHNJvWtLMXOKXGaqKUms0vPb8wXSSJCtyE7N3JP2ggfKCZRjHdxmq9
/eFc8Zndi0wJoeGY0PJLOq7lZVWJrJXFaee8JQ0fFjA+q6h9IVzAqTUOF3vEW/rq48RIueT90Cum
y78pvs3yABP6Ei+AK0Py7qm5huowPAAAA//8DAA=="
}
# 此处游标 cursor 值需要根据读者执行的操作进行修改,请勿直接使用
POST _sql/close
{
 "cursor": 
"8/LoA0RGTABEissKgkAYRh2QiAh8FZVcuExKaWisxEbHTUzO7wVH7TKSb19Gi87ig8N3UIaeox/
IgdmjlQW0YLY7iICuhO9aIpHNJvWtLMXOKXGaqKUms0vPb8wXSSJCtyE7N3JP2ggfKCZRjHdxmq9
/eFc8Zndi0wJoeGY0PJLOq7lZVWJrJXFaee8JQ0fFjA+q6h9IVzAqTUOF3vEW/rq48RIueT90Cum
y78pvs3yABP6Ei+AK0Py7qm5huowPAAAA//8DAA=="
}

 (7)基础聚合查询

在 ES 中使用 SQL 查询的聚合语法与在数据库中使用基本一致

Min

Max

Avg

Sum

Count(*)

Distinct

GET _sql?format=txt
{
 "query": """
 SELECT 
 MIN(page_count) min, 
 MAX(page_count) max, 
 AVG(page_count) avg,
 SUM(page_count) sum,
 COUNT(*) count,
 COUNT(DISTINCT name) dictinct_count 
 FROM "my-sql-index"
 """
}

6、支持的函数和运算 

(1)比较运算符

# Equality
SELECT * FROM "my-sql-index" WHERE name = 'JAVA'
# Null Safe Equality
SELECT 'elastic' <=> null AS "equals"
SELECT null <=> null AS "equals"
# Inequality
SELECT * FROM "my-sql-index" WHERE name <> 'JAVA'
SELECT * FROM "my-sql-index" WHERE name != 'JAVA'
# Comparison
SELECT * FROM "my-sql-index" WHERE page_count > 500
SELECT * FROM "my-sql-index" WHERE page_count >= 500
SELECT * FROM "my-sql-index" WHERE page_count < 500
SELECT * FROM "my-sql-index" WHERE page_count <= 500
# BETWEEN
SELECT * FROM "my-sql-index" WHERE page_count between 100 and 500
# Is Null / Is Not Null
SELECT * FROM "my-sql-index" WHERE name is not null
SELECT * FROM "my-sql-index" WHERE name is null
# IN
SELECT * FROM "my-sql-index" WHERE name in ('JAVA', 'SCALA')

(2)逻辑运算符

# AND
SELECT * FROM "my-sql-index" WHERE name = 'JAVA' AND page_count > 100
# OR
SELECT * FROM "my-sql-index" WHERE name = 'JAVA' OR name = 'SCALA'
# NOT
SELECT * FROM "my-sql-index" WHERE NOT name = 'JAVA'

(3)数学运算符

# 加减乘除
select 1 + 1 as x
select 1 - 1 as x
select - 1 as x
select 6 * 6 as x
select 30 / 5 as x
select 30 % 7 as x

(4)类型转换

# 类型转换
SELECT '123'::long AS long

(5)模糊查询

# LIKE 通配符
SELECT * FROM "my-sql-index" WHERE name like 'JAVA%'
SELECT * FROM "my-sql-index" WHERE name like 'JAVA_'
# 如果需要匹配通配符本身,使用转义字符
SELECT * FROM "my-sql-index" WHERE name like 'JAVA/%' ESCAPE '/'
# RLIKE 不要误会,这里的 R 表示的不是方向,而是正则表示式 Regex
SELECT * FROM "my-sql-index" WHERE name like 'JAV*A'
SELECT * FROM "my-sql-index" WHERE name rlike 'JAV*A'
# 尽管 LIKE在 Elasticsearch SQL 中搜索或过滤时是一个有效的选项,但全文搜索 MATCH 和 QUERY
速度更快、功能更强大,并且是首选替代方案

(6)聚合分析函数

# FIRST / FIRST_VALUE : FIRST(第一个字段,排序字段)
SELECT first(name, release_date) FROM "my-sql-index"
SELECT first_value(substring(name,2,1)) FROM "my-sql-index"
# LAST / LAST_VALUE : LAST (第一个字段,排序字段)
SELECT last(name, release_date) FROM "my-sql-index"
SELECT last_value(substring(name,2,1)) FROM "my-sql-index"
# KURTOSIS 量化字段的峰值分布
SELECT KURTOSIS(page_count) FROM "my-sql-index"
# MAD
SELECT MAD(page_count) FROM "my-sql-index"

(7)分组函数

# HISTOGRAM : 直方矩阵
SELECT HISTOGRAM(page_count, 100) as c, count(*) FROM "my-sql-index" group by 
c

 (8)数学通用函数

# ABS:求数字的绝对值
select ABS(page_count) from "myindex" limit 5
# CBRT:求数字的立方根,返回 double
select page_count v,CBRT(page_count) cbrt from "myindex" limit 5
# CEIL:返回大于或者等于指定表达式最小整数(double)
select page_count v,CEIL(page_count) from "myindex" limit 5
# CEILING:等同于 CEIL
select page_count v,CEILING(page_count) from "myindex" limit 5
# E:返回自然常数 e(2.718281828459045)
select page_count,E(page_count) from "myindex" limit 5
# ROUND:四舍五入精确到个位
select ROUND(-3.14)
# FLOOR:向下取整
select FLOOR(3.14)
# LOG:计算以 2 为底的自然对数
select LOG(4)
# LOG10:计算以 10 为底的自然对数
select LOG10(100)
# SQRT:求一个非负实数的平方根
select SQRT(9)
# EXP:此函数返回 e(自然对数的底)的 X 次方的值
select EXP(3)

(9)三角函数

# DEGREES:返回 X 从弧度转换为度值
select DEGREES(x)
# RADIANS:返回 X 从度转换成弧度的值
select RADIANS(x)
# SIN:返回 X 的正弦
select SIN(x)
# COS:返回 X,X 值是以弧度给出的余弦值
select COS(角度)
# TAN:返回参数 X,表示以弧度的切线值
select TAN(角度)
# ASIN:返回 X 的反正弦,X 的值必须在-1 至 1 范围内,返回 NULL
select ASIN(x)
# ACOS:返回 X 的反正弦,X 值必须-1 到 1 之间范围否则将返回 NULL
select ACOS(x)
# ATAN:返回 X 的反正切
select ATAN(x)
# SINH:返回 X 的双曲正弦值
select SINH(x)
# COSH:返回 X 的双曲余弦值
select COSH(x)

(10)日期时间函数

# YEAR:
SELECT YEAR(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS year
# MONTH_OF_YEAR() or MONTH():
SELECT MONTH(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS month
# WEEK_OF_YEAR() or WEEK():
SELECT WEEK(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS week
# DAY_OF_YEAR() or DOY() ,效果等同于 EXTRACT(<datetime_function> FROM 
<expression>):
SELECT DOY(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS day
# DAY_OF_MONTH(), DOM(), or DAY():
SELECT DAY(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS day
# DAY_OF_WEEK() or DOW():
SELECT DOW(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS day
# HOUR_OF_DAY() or HOUR():
SELECT HOUR(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS hour
# MINUTE_OF_DAY():
SELECT MINUTE_OF_DAY(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS minute
# MINUTE_OF_HOUR() or MINUTE():
SELECT MINUTE(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS minute
# SECOND_OF_MINUTE() or SECOND():
SELECT SECOND(CAST('2022-05-01T00:00:00Z' AS TIMESTAMP)) AS second

(11)全文检索函数

# MATCH:MATCH(匹配字段,规则, 配置参数(可选))
SELECT * FROM "my-sql-index" where MATCH(name, 'JAVA')
SELECT * FROM "my-sql-index" where MATCH(name, 'java')
# MATCH:MATCH(('匹配字段^权重 1,匹配字段^权重 2',规则, 配置参数(可选))
SELECT * FROM "my-sql-index" where MATCH('author^2,name^5', 'java')
# QUERY
SELECT * FROM "my-sql-index" where QUERY('name:Java')
# SCORE : 评分
SELECT *, score() FROM "my-sql-index" where QUERY('name:Java')

(12)字符串检索函数

# ASCII : 字符串转成 ASC 码
SELECT ASCII('Elastic')
# BIT_LENGTH : 位长度
SELECT BIT_LENGTH('Elastic')
SELECT BIT_LENGTH('中国')
# CHAR :转换字符
SELECT CHAR(69)
# CHAR_LENGTH :字符长度
SELECT CHAR_LENGTH('Elastic')
# CONCAT:合并
SELECT CONCAT('Elastic', 'search')
# INSERT : INSERT(字符串,起始位置,长度,插入的内容)
SELECT INSERT('Elastic', 8, 1, 'search')
SELECT INSERT('Elastic', 7, 1, 'search')
# LCASE :转换小写
SELECT LCASE('Elastic')
# LEFT : 获取左边最多 N 个字符
SELECT LEFT('Elastic',3)
# LENGTH
SELECT length('Elastic')
SELECT length('中国')
# LOCATE : LOCATE(表达式,字符串,起始位置),获取满足条件的位置
SELECT LOCATE('a', 'Elasticsearch')
SELECT LOCATE('a', 'Elasticsearch', 5)
# LTRIM :去除左边的空格
SELECT LTRIM(' Elastic')
# OCTET_LENGTH : 字节长度
SELECT OCTET_LENGTH('Elastic')
SELECT OCTET_LENGTH('中国')
# POSITION :获取指定字符串的位置
SELECT POSITION('Elastic', 'Elasticsearch')
# REPEAT :将字符串重复指定次数
SELECT REPEAT('Elastic', 3)
# REPLACE :替换数据
SELECT REPLACE('Elastic','El','Fant')
# RIGHT :从右边获取指定数量的数据
SELECT RIGHT('Elastic',3)
# RTRIM :去除右边的空格
SELECT RTRIM('Elastic ')
# SPACE : 生成指定数量的空格
SELECT concat(SPACE(3),'abc')
# STARTS_WITH : 判断是否以指定字符串开头
SELECT STARTS_WITH('Elasticsearch', 'Elastic')
# SUBSTRING : 截取字符串,必须传递三个参数
SELECT SUBSTRING('Elasticsearch', 0, 7)
# TRIM :去掉首尾空格
SELECT TRIM(' Elastic ') AS trimmed
# UCASE : 转换大写
SELECT UCASE('Elastic')

(13)条件分支函数

# 多重分支判断
SELECT CASE 5
 WHEN 1 THEN 'elastic'
 WHEN 2 THEN 'search'
 WHEN 3 THEN 'elasticsearch'
 ELSE 'default'
 END AS "case"
SELECT CASE WHEN 1 > 2 THEN 'elastic'
 WHEN 2 > 10 THEN 'search'
 ELSE 'default'
 END AS "case"
# IFNULL
SELECT IFNULL('elastic', null) AS "ifnull"
SELECT IFNULL(null, 'search') AS "ifnull"
# IIF
SELECT IIF(1 < 2, 'TRUE', 'FALSE') AS result1, IIF(1 > 2, 'TRUE', 'FALSE') AS 
result2
# ISNULL
SELECT ISNULL('elastic', null) AS "isnull"
SELECT ISNULL(null, 'search') AS "isnull"
# LEAST:获取除 null 外的最小值
SELECT LEAST(null, 2, 11) AS "least"
SELECT LEAST(null, null, null, null) AS "least"
# NULLIF : 如果两个字符串不相同,则返回第一个字符串,如果相同,返回 null
SELECT NULLIF('elastic', 'search') AS "nullif"
SELECT NULLIF('elastic', 'elastic') AS "nullif"
# NVL : 返回第一个不是 null 的字符串,如果都是 null,那么返回 Null
SELECT NVL('elastic', null) AS "nvl"
SELECT NVL(null, null) AS "nvl"

(14)系统函数文章来源地址https://www.toymoban.com/news/detail-600609.html

# ES 集群
SELECT DATABASE()
# 用户
SELECT USER()

到了这里,关于Elasticsearch - EQL;SQL(十三)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • sql语句转为es查询条件(elasticsearch-sql使用)

    github源码地址: https://gitee.com/weiyxiong_admin/elasticsearch-sql/blob/master/src/test/java/org/nlpcn/es4sql/ExplainTest.java 1、添加pom.xml依赖 2、scala 将sql转为es查询json语句 3、测试 4、查询返回结果展示(即步骤三esJSON结果打印) 5、打开postman

    2024年02月13日
    浏览(51)
  • 关于Elasticsearch(es)中使用sql返回结果只有1000条

    es中返回的结果只有1000条,这是默认的,想要返回更多的结果,需要做两步: 1、设置max_result_window的大小 PUT indexName/_settings { “max_result_window”:20000 } max_result_window表示结果的最大数量 但是你这样设置完了之后,查询依旧还是1000条 2、查询的时候加上fetch_size 这表示页面上显

    2024年02月14日
    浏览(41)
  • 使用DataGrip连接SQL

    1、打开Sql Server配置管理器,开启TCP/IP协议和Named Pipes协议 2、重启SQL服务  3、在DataGrip中连接SQL并测试连接

    2024年02月15日
    浏览(29)
  • Datagrip链接高版本Elasticsearch实现方法

    首先确认一下使用的es版本确认好之后进入官网下载对应的jdbc-jar es官网JDBC-clent.jar链接 下载到本机 打开Datagrip创建一个新的drive 点击Custom JARS后选择正确的jar包同时切换class然后点击apply和ok,这样子drive就创建完成了 用自己创建的drive来创建es链接 填写URL密码和用户名—注意

    2024年02月14日
    浏览(38)
  • datagrip连接elasticsearch且进行查询20230506

    背景:公司要做一个es的数据存储,然后通过接口进行查询,我在docker下完成了ELK的安装,但是对es还不是很了解,就想着用logstash加载完数据到es中后,在数据库中对es进行查询,发现datagrip是支持连接es的,然后就想着把整个流程记录下来吧 第一步:在datagrip中找到连接es的地

    2024年02月08日
    浏览(33)
  • DataGrip|SQL 自动格式化常用配置(完整版)

    版本:DataGrip 2023.2.1 配置方法:Settings Code Style SQL General(或其他语言) Word Case 单词大小写设置 Keywords:大小写设置(例如 SELECT 、 WHERE 、 AS 等) Identifiers:标识符大小写设置(例如表名、列名等) Built-in types:内置类型大小写设置(例如 INT 、 VARCHAR 等) Custom type

    2024年01月21日
    浏览(45)
  • 使用DataGrip创建数据库并读取sql文件

    DataGrip是由 JetBrains 公司生产的又一个强大且优秀的数据库管理工具。它支持几乎所有的主流的关系数据库产品。对于一些习惯使用Navicat来说,使用DataGrip不太习惯。下面我通过DataGrip 2023.1创建数据库并读取sql文件,其实这个过程是很简单的 DataGrip安装完成后第一次使用时基本

    2024年02月07日
    浏览(38)
  • 4、Elasticsearch7.6.1 Java api操作ES(CRUD、两种分页方式、高亮显示)和Elasticsearch SQL详细示例

    1、介绍lucene的功能以及建立索引、搜索单词、搜索词语和搜索句子四个示例实现 2、Elasticsearch7.6.1基本介绍、2种部署方式及验证、head插件安装、分词器安装及验证 3、Elasticsearch7.6.1信息搜索示例(索引操作、数据操作-添加、删除、导入等、数据搜索及分页) 4、Elasticsearch7

    2024年02月16日
    浏览(76)
  • DataGrip编写SQL语句操作Spark(Spark ThriftServer)

    Spark ThriftServer 相当于一个持续性的Spark on Hive集成模式,可以启动并监听在10000端口,持续对外提供服务,可以使用数据库客户端工具或代码连接上来,操作Spark bin/spark-sql 脚本,类似于Hive的 bin/hive脚本 ( 内部内置了hive的hiveServer2服务或Spark执行引擎,每次脚本执行,都会启动

    2024年02月12日
    浏览(40)
  • DataGrip连接数据库设置(MySQL、Oracle、SQL Server)

    1.1 配置信息 1.2 测试查询employees库中departments表信息 employees为测试库,具体来源,参考这篇文章 下载并导入MySQL示例数据库employees 。 1.3 测试查询employees库中employees表信息 将SID改为orcl: 3.1 打开DG后新建Data Source-Microsoft SQL Server 下载驱动文件后按图中配置: 3.2 开启Named Pipes和

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包