1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!
3.Elasticsearch原则上适合一切非事务性应用场景或能够容许一定的延迟的事务性场景;能最大限度的替代mongodb与传统关系型数据库
索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
对历史数据无效!!!!
一定要重建索引!!!!
1、ESSOL概要介绍SOL需求背景
###SOL需求背景
DSL难于掌握,语法过于复杂
SOL拥有广大的群众基础,便于推广
ES-JDBC能力,便于与其它JDBC混搭
SOL是大数据产品的标配
早期基于NLPChina插件实现
SQL -> DSL -> 执行
SQL概念映射
数据库与ES概念映射Elasticsearch
sql Elasticsearch
数据列 column 字段 field
数据行 row 数据文档 document
数据表 table 索引index
表结构 schema 映射 mapping
数据库 database ES集群 cluster
SQL执行接口
SQL执行接口执行接口,执行SOL语言表达式
GET _sql
2、SOL常用查询
查询参数
_sql,执行sql查询 API
format,返回结果的格式化,支持多种,默认ison
query,执行SOL脚本输入
# dsl查询方式
GET kibana_sample_data_flights/_search
{
"track_total_hits":true,
"size":1
}
# sql查询方式
GET _sql
{
"query":"""
select * from "kibana_sample_data_flights"
"""
}
通过对比结果发现
dsl每条数据都是json格式,包含了key/value
sql类似于excel,columns单独返回了表头,rows中只有value,数据包减小了,可以作为性能优化点
返回1条数据和指定字段
GET _sql?format=json
{
"query":"""
select AvgTicketPrice, Cancelled from "kibana_sample_data_flights" limit 1
"""
}
format 内容格式
支持多种响应格式,默认 Json
查询参数
参数说明
json 默认 ,相比原有 dsl-json 大大减少资源
csv Excel 表格,分隔符
tsv
txt 文本
yaml
cbor 二进制编码
smile 二进制编码
csv格式
# csv格式
GET _sql?format=csv
{
"query":"""
select AvgTicketPrice, Cancelled from "kibana_sample_data_flights" limit 1
"""
}
# yaml格式
GET _sql?format=yaml
{
"query":"""
select AvgTicketPrice, Cancelled from "kibana_sample_data_flights" limit 1
"""
}
SQL 分页
SOL执行查询下,分页采用的是快照方式,基于游标
查询参数
fetch_size,分页大小,默认 1000
分页查询,注意返回结果中的cursor,cursor相当于游标,用于翻页
GET _sql
{
"query":"""
select * from "kibana_sample_data_flights"
""",
"fetch_size": 2
}
使用cursor翻页,每次都要重新获取上一次结果的cursor作为下一页的入参
GET _sql
{"cursor": "i/vrA0RGTACEVMty2jAUlVwohYRkptss+gVdQNPpZGkwhCTFFAKYeOMRlrAVhMXYIgz/1UX/LpVsEyxCp9pY99yr+5DOMXQBDIEBgVqvcl2mOyAhWFtQwrCX8FiUPMz91yxKLfgbfgCGITfp0bLcpassEZUFXl2YL8GY+ksifsXUJ8CotlHkE8YIBkaljeKYkhgYJYskAhh19TFpvJa17ixgnCu7TcXORit59iw1+SYS8S53/uQ+EpRHwKgp54gEqZFGOgSJUGX/bNFEqLIPlPEVESROVK0c7FNGpH3WZTQIhUUYkskvClafyoyXBWC8W6tJMsTerN7Cx3RFenwjS9YzpwLS4x8HMQ3SPNmmMORFhhzGrOfAftA84DDqeRawHzaPfxu3itFusHAIWcomhexADr9awy+JkE8gPIwE8fha3RpinvJ7EYp4YsA/kHovsbntINRk9Mn5Hs6+2eF81krc6c3yaTYKZ003QQ7muNd30G2j50/X4bgRjvD4/sGdjPpO52bQn7nJZGg6w6bbmDt2H3fuH+2OL3BjaqFbvPUtNsBbM19f0Y+Wa82du63btVuD6SgkE/t6OA4f58+ta7Lsjkyz879aJqjltL2CiyPKwfKCcSQkIxcH7sHKnHNGUKTgPQ1hZUl2Wx5jBaaM1BCdnJpL46nmKVL2/ZH9k8JqQLi35jRK+yxQ+X2y/Jk1xwmCF8bWmV5wFCmv3cgR+2FFNkYCKSXZ3LEQtEYOmtDgPN9eHvq1akopdJdLRgs+Vo9eRReSXkXT1Klj/3gLTWunUp56j4MCtasriPGTUqHSHgAl+aOsAPAXAAD//wMA"
}
结果行转列
在部分场景下,我们需要提取数据按照列示的方式,可以减少转换
ES 默认情况下,类数据全部是按照行式返回的
目前限定 format格式必须是json/yaml才可以
查询参数
columnar,取值范围 true/false
columnar行转列,查询目的地城市名
GET _sql
{
"query":"""
select DestCityName from "kibana_sample_data_flights"
""",
"fetch_size": 2,
"columnar":true
}
默认的,查询目的地城市名,对比两或者差异
GET _sql
{
"query":"""
select DestCityName from "kibana_sample_data_flights"
""",
"fetch_size": 2
}
查询过滤条件参数化
ES 提供的 SOL查询近可能的靠近 SOL的表达能力,但与标准的SOL还是有点差距
查询参数
params,提供参数化
sql中入参
GET _sql
{
"query":"""
select * from "kibana_sample_data_flights" where DestCountry='CN'
""",
"fetch_size": 2
}
占位符参数
GET _sql
{
"query":"""
select * from "kibana_sample_data_flights" where DestCountry=?
""",
"fetch_size": 2,
"params":["CN"]
}
SOL与 DSL混合限制查询
SOL执行查询时,也可以基于 DSL编写限制过滤条件
查询参数
filter,限制条件查询关键字表达式
dsl查询方式
GET kibana_sample_data_flights/_search
{
"track_total_hits":true,
"size":1,
"query":{
"bool": {
"filter": [
{
"term": {
"DestCountry": "CN"
}
}
]
}
}
}
混合查询方式
GET _sql
{
"query": """
select * from "kibana_sample_data_flights"
""",
"fetch_size": 2,
"filter": {
"term": {
"DestCountry": "CN"
}
}
}
sql 翻译成 dsl
GET _sql/translate
{
"query":"""
select DestCityName,DistanceMiles from "kibana_sample_data_flights" where DestCountry='CN'
""",
"fetch_size": 2
}
使用上面的返回结果查询
GET kibana_sample_data_flights/_search
{
"size": 2,
"query": {
"term": {
"DestCountry": {
"value": "CN"
}
}
},
"_source": false,
"fields": [
{
"field": "DestCityName"
},
{
"field": "DistanceMiles"
}
],
"sort": [
{
"_doc": {
"order": "asc"
}
}
],
"track_total_hits": -1
}
常用 SQL
SQL语法
SQL查询语法几乎与常用的 SOL标准是一样的
查询语法
SELECT [TOP [ count ]]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 ][, ..] ))]
精确查询
dsl查询方式
GET kibana_sample_data_flights/_search
{
"track_total_hits":true,
"size":1,
"query":{
"bool": {
"filter": [
{
"term": {
"DestCountry": "CN"
}
}
]
}
}
}
sql
GET _sql
{
"query":"""
select DestCountry,DestCityName,DistanceMiles from "kibana_sample_data_flights" where DestCountry='CN'
""",
"fetch_size": 2
}
分词查询
GET kibana_sample_data_flights_3share/_mappings
dsl查询方式, 使用kibana_sample_data_flights_3share索引
GET kibana_sample_data_flights_3share/_search
{
"track_total_hits": true,
"size": 1,
"query": {
"match": {
"Dest": "International"
}
}
}
sql 分词,注意排序与dsl不同,最好加order by
GET _sql
{
"query":"""
select DestCountry,DestCityName,DistanceMiles from "kibana_sample_data_flights_3share" where match(Dest,'International')
""",
"fetch_size": 2
}
sql 常用聚合
指标聚合、分桶聚合、管道聚合、混合聚合
avg,dsl查询方式
GET kibana_sample_data_flights/_search
{
"track_total_hits":true,
"size":0,
"aggs":{
"avg_FlightTimeMin":{
"avg": {
"field": "FlightTimeMin"
}
}
}
}
avg,sql查询方式
GET _sql
{
"query":"""
select avg(FlightTimeMin) from "kibana_sample_data_flights"
"""
}
分组聚合,dsl方式
GET kibana_sample_data_flights/_search
{
"track_total_hits": true,
"size": 0,
"aggs": {
"trems_DestCountry": {
"terms": {
"field": "DestCountry",
"size": 100,
"order": {
"_key": "asc"
}
},
"aggs": {
"stats_FlightTimeMin": {
"stats": {
"field": "FlightTimeMin"
}
}
}
}
}
}
分组聚合,sql查询方式
GET _sql
{
"query":"""
select avg(FlightTimeMin) as avg, max(FlightTimeMin) as max, min(FlightTimeMin) as min, DestCountry from "kibana_sample_data_flights" group by DestCountry
"""
}
3、SOL高级查询
查询所有索引
GET _cat/indices
GET _sql
{
"query":"""
show tables
"""
}
查询支持的函数
GET _sql
{
"query":"""
show functions
"""
}
查询所有列
GET _sql
{
"query":"""
show columns in "kibana_sample_data_flights"
"""
}
GET _sql
{
"query":"""
describe "kibana_sample_data_flights"
"""
}
时间函数
GET _sql
{
"query":"""
select CURRENT_DATE(),CURRENT_DATE,CURRENT_TIME(),CURRENT_TIME,CURRENT_TIMESTAMP
(),CURRENT_TIMESTAMP,DATEADD('year',1,CURRENT_DATE)
"""
}
case
GET _sql
{
"query":"""
SELECT CASE 3
WHEN 1 THEN 'one'
WHEN 3 THEN 'three'
WHEN 5 THEN 'five'
END AS "case"
"""
}
SQL 函数
全文文本函数
ESSOL全文检索与标准 SOL有差异,采用定制函数的方式实现
MATCH,查询函数关键字
查询出发地国家包括"CN"的航班信息
GET _sql
{
"query":"""
select DestCountry,DestCityName,DistanceMiles from "kibana_sample_data_flights_3share" where match(DestCountry,'CN')
""",
"fetch_size": 2
}
常用聚合函数
AVG,SUM ,MIN,MAXCOUNT
FIRST, LAST, FIRST_VALUE, LAST_VALUE
提取航班信息中,第一个出发地国家,最后一个出发地国家
GET _sql
{
"query":"""
select FIRST(DestCountry) as first, FIRST_VALUE(DestCountry) FIRST_VALUE,LAST(DestCountry) as last, min(FlightTimeMin) as min from "kibana_sample_data_flights"
"""
}
统计类聚合函数
PERCENTILE, PERCENTILE_RANK
其它聚合统计函数,查阅官方网站
基于百分位占比,统计航班信息中飞行时间长百分位占比;第1个,统计第95 百分位的飞行时间平均时间;第2个,统计飞行时间为 700的百分位占比
GET _sql
{
"query":"""
select PERCENTILE(FlightTimeMin,95), PERCENTILE_RANK(FlightTimeMin,700) from "kibana_sample_data_flights"
"""
}
分桶类聚合函数
HISTOGRAM,直方图统计函数,必须带上group关键字
按照飞行时间统计所有航班信息,按照100 间隔;此处对比结果,并没有 DSL表达能力好
GET _sql
{
"query":"""
select HISTOGRAM(FlightTimeMin,100) as h,count(0) from "kibana_sample_data_flights" group by h
"""
}
数学函数
ESSOL支持很多数学函数
ABS
绝对值查询,去掉负数;对比 DSL没有此功能,需要通过脚本的机制转换
GET _sql
{
"query":"""
select abs(-10)
"""
}