Elasticsearch已经支持SQL查询了(6.3版本以后)
Elasticsearch已经支持SQL查询了(6.3版本以后)
第一个SQL查询
使用SQL来查询下前10条记录,可以通过format参数控制返回结果的格式,txt表示文本格式,看起来更直观点,默认为json格式。
在Kibana的Console中输入如下命令:
POST /_sql?format=txt
{
"query": "SELECT teamNameEn,age,birthDay,code,teamName FROM nba LIMIT 10"
}
查询结果:
将SQL转化为DSL
需要使用Query DSL时,也可以先使用SQL来查询,然后通过Translate API转换即可。
翻译以下查询语句:
POST /_sql/translate
{
"query": "SELECT teamNameEn,age,birthDay,code,teamName FROM nba LIMIT 10"
}
结果如下:
SQL和DSL混合使用
还可以将SQL和Query DSL混合使用,比如使用Query DSL来设置过滤条件。
查询age在18-20之间的记录,可以使用如下查询语句:
POST /_sql?format=txt
{
"query": "SELECT teamNameEn,age,birthDay,code,teamName FROM nba ",
"filter": {
"range": {
"age": {
"gte" : 18,
"lte" : 20
}
}
},
"fetch_size": 10
}
查询结果:
支持的函数
使用SQL查询ES中的数据,不仅可以使用一些SQL中的函数,还可以使用一些ES中特有的函数。
查询支持的函数
可以使用SHOW FUNCTIONS语句查看所有支持的函数。
POST /_sql?format=txt
{
"query": "SHOW FUNCTIONS "
}
比如搜索所有带有DATE字段的函数可以使用如下语句:
全文搜索函数
全文搜索函数是ES中特有的,当使用MATCH或QUERY函数时,会启用全文搜索功能,SCORE函数可以用来统计搜索评分。
MATCH()
使用MATCH函数查询displayNameEn中包含Jaylen的记录:
POST /_sql?format=txt
{
"query": "SELECT displayNameEn,teamNameEn,age,birthDay,code,teamName,SCORE() FROM nba WHERE MATCH(displayNameEn,'Jaylen') LIMIT 10"
}
如图: QUERY()
POST /_sql?format=txt
{
"query": "SELECT displayNameEn,teamNameEn,age,birthDay,code,teamName,SCORE() FROM nba WHERE QUERY('displayNameEn:Jaylen') LIMIT 10"
}
如图:
|