在es中使用SQL功能
介绍
Elasticsearch SQL是Elasticsearch的扩展功能,允许用户使用SQL语法查询Elasticsearch数据。通过SQL接口,开发者可以利用熟悉的SQL语言,编写更直观、更易懂的查询,并且避免对大量复杂的原生REST请求的编写。
官方ElasticSearch 从 6.3.0 版本也开始支持 SQL 查询了,官方的文档和介绍:https://www.elastic.co/guide/en/elasticsearch/reference/8.9/sql-overview.html
Elasticsearch SQL主要优势
- 易用性:使用熟悉的SQL语法,降低了学习成本。
- 灵活性:支持复杂的查询和聚合操作。
- 性能:Elasticsearch本身的分布式架构和高效查询引擎保证了查询性能。
- 集成性:通过JDBC驱动,可以与各种SQL工具和应用程序集成。
Elasticsearch SQL的使用
其实和查询Mysql差不多的查询语句
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 ] [, ...] ) ) ]
目前FROM只支持单表
用SQL查询
# 使用curl命令查询
curl -X POST "localhost:9200/_sql?format=txt" -H 'Content-Type: application/json' -d'{ "query": "SELECT * FROM prometheusalert-20249 order by created"}'
# 使用 kibana界面
POST /_sql?format=txt
{
"query": "SELECT created,DATETIME_FORMAT(created, 'YYYY-MM-dd') date FROM \"prometheusalert-20249\" order by created"
}
format=txt 是指查询返回结果的数据格式,其他返回格式参考:
https://www.elastic.co/guide/en/elasticsearch/reference/8.9/sql-rest-format.html
将SQL转换为DSL
GET /_sql/translate
{"query":"SELECT * FROM \"prometheusalert-20249\" limit 1"}
# 返回结果
{
"size" : 1,
"_source" : false,
"fields" : [
{
"field" : "alertname"
},
{
"field" : "created",
"format" : "strict_date_optional_time_nanos"
},
{
"field" : "description"
},
{
"field" : "endsAt",
"format" : "strict_date_optional_time_nanos"
},
{
"field" : "instance"
},
{
"field" : "labels"
},
{
"field" : "level"
},
{
"field" : "startsAt",
"format" : "strict_date_optional_time_nanos"
},
{
"field" : "status"
},
{
"field" : "summary"
}
],
"sort" : [
{
"_doc" : {
"order" : "asc"
}
}
]
}
全文检索
当使用MATCH函授时,会启用全文搜索功能。
MATCH函数使用
GET /_sql?format=txt
{"query":"select * from \"prometheusalert-202410\" where MATCH(description, 'http状态码检测失败') limit 10"}
# 使用格式
MATCH(field_exp,constant_exp[, options])
field_exp:匹配字段
constant_exp:匹配常量表达式
DESCRIBE
使用DESCRIBE语句查看索引中有哪些字段,比如查看es_order索引的字段,查询语句如下。
POST /_sql?format=txt
{ "query": "DESCRIBE \"prometheusalert-202410\""}
SHOW TABLES
使用SHOW TABLES查看所有的索引
POST /_sql?format=txt
{ "query": "SHOW TABLES"}
查询支持的函数
POST /_sql?format=txt
{ "query": "SHOW FUNCTIONS"}
POST /_sql?format=txt
{ "query": "SHOW FUNCTIONS LIKE '%DATE%'"}