Elasticsearch官方已支持SQL查询,用起来贼方便!

标签: elasticsearch 官方 sql | 发表时间:2020-12-03 00:56 | 作者:MacroZheng
出处:https://juejin.im/backend?sort=monthly_hottest

SpringBoot实战电商项目mall(40k+star)地址: github.com/macrozheng/…

摘要

平时使用Elasticsearch的时候,偶尔会在Kibana中使用Query DSL来查询数据。每次要用到Query DSL时都基本忘光了,需要重新在回顾一遍,最近发现Elasticsearch已经支持SQL查询了(6.3版本以后),整理了下其用法,希望对大家有所帮助!

简介

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

Elasticsearch SQL具有如下特性:

  • 原生支持:Elasticsearch SQL是专门为Elasticsearch打造的。
  • 没有额外的零件:无需其他硬件,处理器,运行环境或依赖库即可查询Elasticsearch,Elasticsearch SQL直接在Elasticsearch内部运行。
  • 轻巧高效:Elasticsearch SQL并未抽象化其搜索功能,相反的它拥抱并接受了SQL来实现全文搜索,以简洁的方式实时运行全文搜索。

学前准备

学习之前我们需要先对Elasticsearch有所了解,并安装好Elasticsearch和Kibana,这里安装的是7.6.2版本,具体可以参考 《Elasticsearch快速入门,掌握这些刚刚好!》

安装完成后在Kibana中导入测试数据,数据地址: github.com/macrozheng/…

直接在Kibana的Dev Tools中运行如下命令即可:

第一个SQL查询

我们使用SQL来查询下前10条记录,可以通过 format参数控制返回结果的格式,txt表示文本格式,看起来更直观点,默认为json格式。

在Kibana的Console中输入如下命令:

   POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance FROM account LIMIT 10"
}
复制代码

查询结果显示如下。

将SQL转化为DSL

当我们需要使用Query DSL时,也可以先使用SQL来查询,然后通过Translate API转换即可。

例如我们翻译以下查询语句:

   POST /_sql/translate
{
  "query": "SELECT account_number,address,age,balance FROM account WHERE age>32 LIMIT 10"
}
复制代码

最终获取到Query DSL结果如下。

SQL和DSL混合使用

我们还可以将SQL和Query DSL混合使用,比如使用Query DSL来设置过滤条件。

例如查询age在30-35之间的记录,可以使用如下查询语句:

   POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance FROM account",
      "filter": {
        "range": {
            "age": {
                "gte" : 30,
                "lte" : 35
            }
        }
    },
    "fetch_size": 10
}
复制代码

查询结果展示如下:

SQL和ES对应关系

SQL ES 描述
column field 数据库中表的字段与ES中的属性对应
row document 数据库表中的行记录与ES中的文档对应
table index 数据库中的表与ES中的索引对应

常用SQL操作

语法

在ES中使用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 ] [, ...] ) ) ]
复制代码

WHERE

可以使用 WHERE语句设置查询条件,比如查询state字段为VA的记录,查询语句如下。

   POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,state FROM account WHERE state='VA' LIMIT 10 "
}
复制代码

查询结果展示如下:

GROUP BY

我们可以使用 GROUP BY语句对数据进行分组,统计出分组记录数量,最大age和平均balance等信息,查询语句如下。

   POST /_sql?format=txt
{
  "query": "SELECT state,COUNT(*),MAX(age),AVG(balance) FROM account GROUP BY state LIMIT 10"
}
复制代码

HAVING

我们可以使用 HAVING语句对分组数据进行二次筛选,比如筛选分组记录数量大于15的信息,查询语句如下。

   POST /_sql?format=txt
{
  "query": "SELECT state,COUNT(*),MAX(age),AVG(balance) FROM account GROUP BY state HAVING COUNT(*)>15 LIMIT 10"
}
复制代码

ORDER BY

我们可以使用 ORDER BY语句对数据进行排序,比如按照balance字段从高到低排序,查询语句如下。

   POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,state FROM account ORDER BY balance DESC LIMIT 10 "
}
复制代码

DESCRIBE

我们可以使用 DESCRIBE语句查看表(ES中为索引)中有哪些字段,比如查看account表的字段,查询语句如下。

   POST /_sql?format=txt
{
  "query": "DESCRIBE account"
}
复制代码

SHOW TABLES

我们可以使用 SHOW TABLES查看所有的表(ES中为索引)。

   POST /_sql?format=txt
{
  "query": "SHOW TABLES"
}
复制代码

支持的函数

使用SQL查询ES中的数据,不仅可以使用一些SQL中的函数,还可以使用一些ES中特有的函数。

查询支持的函数

我们可以使用 SHOW FUNCTIONS语句查看所有支持的函数,比如搜索所有带有 DATE字段的函数可以使用如下语句。

   POST /_sql?format=txt
{
  "query": "SHOW FUNCTIONS LIKE '%DATE%'"
}
复制代码

全文搜索函数

全文搜索函数是ES中特有的,当使用 MATCHQUERY函数时,会启用全文搜索功能, SCORE函数可以用来统计搜索评分。

MATCH()

使用 MATCH函数查询address中包含Street的记录。

   POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,SCORE() FROM account WHERE MATCH(address,'Street') LIMIT 10"
}
复制代码

QUERY()

使用 QUERY函数查询address中包含Street的记录。

   POST /_sql?format=txt
{
  "query": "SELECT account_number,address,age,balance,SCORE() FROM account WHERE QUERY('address:Street') LIMIT 10"
}
复制代码

SQL CLI

如果你不想使用Kibana来使用ES SQL的话,也可以使用ES自带的SQL CLI来查询,该命令位于ES的bin目录下。

使用如下命令启动SQL CLI:

   elasticsearch-sql-cli http://localhost:9200
复制代码

然后直接输入SQL命令即可查询了,注意要加分号。

   SELECT account_number,address,age,balance FROM account LIMIT 10;
复制代码

局限性

使用SQL查询ES有一定的局限性,没有原生的Query DSL那么强大,对于嵌套属性和某些函数的支持并不怎么好,但是平时用来查询下数据基本够用了。

参考资料

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/xpack-sql.html

本文 GitHub github.com/macrozheng/… 已经收录,欢迎大家Star!

相关 [elasticsearch 官方 sql] 推荐:

Elasticsearch官方已支持SQL查询,用起来贼方便!

- - 掘金后端本月最热
SpringBoot实战电商项目mall(40k+star)地址:. 平时使用Elasticsearch的时候,偶尔会在Kibana中使用Query DSL来查询数据. 每次要用到Query DSL时都基本忘光了,需要重新在回顾一遍,最近发现Elasticsearch已经支持SQL查询了(6.3版本以后),整理了下其用法,希望对大家有所帮助.

启动并运行 Open Distro for Elasticsearch | 亚马逊AWS官方博客

- -
2019 年 3 月 11 日,我们发布了. Open Distro for Elasticsearch,这是 Elasticsearch 的一个增值发行版,100% 开源(采用 Apache 2.0 许可证)并且由 AWS 提供支持. (另请参阅 Jeff Barr 的. Open Distro for Elasticsearch和 Adrian Cockcroft 的.

[译]elasticsearch mapping

- - an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持 string,  integer/ long,  float/ double,  boolean, and  null..

Elasticsearch as Database - taowen - SegmentFault

- -
【北京上地】滴滴出行基础平台部招聘 Elasticsearch 与 Mysql binlog databus 开发工程师. 内推简历投递给: [email protected]. 推销Elasticsearch. 时间序列数据库的秘密(1)—— 介绍. 时间序列数据库的秘密(2)——索引.

PL/SQL动态SQL(原创)

- - ITeye博客
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一. 很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成. 再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只能针对某几个特定的表来形成分页.

ElasticSearch 2 的节点调优(ElasticSearch性能)

- - 行业应用 - ITeye博客
一个ElasticSearch集群需要多少个节点很难用一种明确的方式回答,但是,我们可以将问题细化成一下几个,以便帮助我们更好的了解,如何去设计ElasticSearch节点的数目:. 打算建立多少索引,支持多少应用. elasticsearch版本: elasticsearch-2.x. 需要回答的问题远不止以上这些,但是第五个问题往往是容易被我们忽视的,因为单个ElasticSearch集群有能力支持多索引,也就能支持多个不同应用的使用.

Elasticsearch:使用 Elasticsearch 进行语义搜索

- - 掘金 后端
在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用. 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果. 虽然关键字搜索对于简化信息检索非常有价值,但它也有其局限性. 主要缺点之一在于它对词汇匹配的依赖. 关键字搜索将查询中的每个单词视为独立的实体,通常会导致结果可能与用户的意图不完全一致.

Derby SQL 分页

- - ITeye博客
    之前在网上看到有人问 Derby SQL 分页实现的问题,网上有人给出这样的解决方案,SQL 如下:. 其实,这样的分页查询,性能不理想,我试过在 300W 数据量中采用这种分页方式,需要 20~30秒之久;其实 Derby 10.6 以上版本有更好的分页支持,直接给出 SQL 实现如下:.

SQL Server--索引

- - CSDN博客推荐文章
         1,概念:  数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力..             2.1优点:  1,大大加快搜索数据的速度,这是引入索引的主要原因..                             2,创建唯一性索引,保证数据库表中每一行数据的唯一性..

MySql动态SQL

- - SQL - 编程语言 - ITeye博客
13.7. 用于预处理语句的SQL语法. MySQL 5.1对服务器一方的预制语句提供支持. 如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势. 候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET.