Elasticsearch不会DSL没事,来试试SQL吧

数据库
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例,最常见的是作为搜索引擎,提供项目中全文搜索。

 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例,最常见的是作为搜索引擎,提供项目中全文搜索。

一提到Elasticsearch,必然需要提到Query DSL,DSL(Domain Specific Language特定领域语言)以JSON请求体的形式,但DSL语法并没有那么直观,如果不经常使用,就会遗忘,等需要用的时候,感觉非常不方便。

[[355139]]

今天我们就看下官方提供的X-Pack,它包含一项SQL功能,可对Elasticsearch索引执行SQL查询并以表格格式返回结果。Elasticsearch SQL(6.3版本以后)不仅允许针对Elasticsearch实时执行类似SQL的查询。也可以使用REST接口,或者使用JDBC,保证任何客户端都可以使用SQL对Elasticsearch中的数据进行原生搜索和聚合数据。我们可以将Elasticsearch SQL看作是一种翻译器,它可以将SQL翻译成Query DSL。

官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/xpack-sql.html

下面我们先使用es + kabana体验一下(安装就不说明了)

构建数据

先创建索引,注意es 7.x去掉了type,本文使用的是7.8.0版本的es和kabana。

创建索引


放入文档数据

 

 

SQL查询数据


SQL语法

在ES中使用SQL查询的语法与在数据库中使用基本一致,具体格式如下:

  1. SELECT select_expr [, ...] 
  2. FROM table_name ] 
  3. WHERE condition ] 
  4. GROUP BY grouping_element [, ...] ] 
  5. HAVING condition] 
  6. ORDER BY expression [ ASC | DESC ] [, ...] ] 
  7. [ LIMIT [ count ] ] 
  8. [ PIVOT ( aggregation_expr FOR column IN ( value [ [ AS ] alias ] [, ...] ) ) ] 

 大家可以在实际中自行体验一下,也可以通过下列语句,将sql转成DSL 

  1. POST /_sql/translate 
  2.   "query""SELECT * FROM student LIMIT 10" 

  

下面我们来看下jdbc的操作

JDBC使用SQL查询

引入依赖

  1. <dependency> 
  2.   <groupId>org.elasticsearch.plugin</groupId> 
  3.   <artifactId>x-pack-sql-jdbc</artifactId> 
  4.   <version>7.8.0</version> 
  5. </dependency> 

注意该依赖maven中央仓库没有,需要配置仓库地址

  1. <repositories> 
  2.         <repository> 
  3.             <id>elastic.co</id> 
  4.             <url>https://artifacts.elastic.co/maven</url> 
  5.         </repository> 
  6.     </repositories> 

 jdbc相关代码

  1. Class.forName("org.elasticsearch.xpack.sql.jdbc.EsDriver"); 
  2. Connection connection = DriverManager.getConnection("jdbc:es://http://127.0.0.1:9200"); 
  3. Statement statement = connection.createStatement(); 
  4. ResultSet resultSet = statement.executeQuery("select name from student"); 
  5. while (resultSet.next()){ 
  6.   System.out.println(resultSet.getString("name")); 

 执行后,报错如下

  1. Exception in thread "main" java.sql.SQLInvalidAuthorizationSpecException: current license is non-compliant for [jdbc] 
  2.     at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection$SqlExceptionType.asException(JreHttpUrlConnection.java:330) 
  3.     at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection.parserError(JreHttpUrlConnection.java:207) 
  4.     at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection.request(JreHttpUrlConnection.java:170) 
  5.     at org.elasticsearch.xpack.sql.client.HttpClient.lambda$post$1(HttpClient.java:106) 
  6.     at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection.http(JreHttpUrlConnection.java:66) 
  7.     at org.elasticsearch.xpack.sql.client.HttpClient.lambda$post$2(HttpClient.java:105) 
  8.     at java.security.AccessController.doPrivileged(Native Method) 
  9.     at org.elasticsearch.xpack.sql.client.HttpClient.post(HttpClient.java:104) 
  10.     at org.elasticsearch.xpack.sql.client.HttpClient.query(HttpClient.java:81) 
  11.     at org.elasticsearch.xpack.sql.jdbc.JdbcHttpClient.query(JdbcHttpClient.java:70) 
  12.     at org.elasticsearch.xpack.sql.jdbc.JdbcStatement.initResultSet(JdbcStatement.java:160) 
  13.     at org.elasticsearch.xpack.sql.jdbc.JdbcStatement.execute(JdbcStatement.java:151) 
  14.     at org.elasticsearch.xpack.sql.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:40) 
  15.     at com.ganhuojun.gracefulshutdown.configuration.Test.main(Test.java:22) 

 发现current license is non-compliant for [jdbc],说明功能被限制,查询下官网发现,jdbc在免费开源的版本是不支持的 

 

查询地址:https://www.elastic.co/cn/subscriptions

那怎么解决呢?

官网提供了我们修改license api的功能,去体验一些新的功能

https://www.elastic.co/guide/en/elasticsearch/reference/master/start-trial.html

按照官网操作后,执行前面的jdbc代码,可以得到正确结果


由于jdbc版本使用需要付费,建议在实际项目中,使用DSL或者SQL REST API操作。

 

责任编辑:姜华 来源: 今日头条
相关推荐

2022-06-17 11:10:43

PandasPolarsPython

2020-09-28 11:09:54

SQLDSL

2020-07-10 12:06:28

WebpackBundleless浏览器

2023-06-13 08:00:57

ChatGPT语言模型

2023-10-29 09:11:03

DSL语法

2020-08-25 08:03:59

测试Sharness结构

2020-11-04 16:34:45

单元测试技术

2021-09-07 11:20:02

binlogMySQL数据库

2023-11-13 12:48:32

语言DSL

2021-08-04 08:31:10

MySQL数据库日志

2022-12-30 09:12:55

查询es搜索值

2019-09-21 21:32:34

数据库SQL分布式

2012-07-03 09:38:42

前端

2020-12-15 10:24:05

2020-08-05 14:28:32

编程程序员代码

2016-09-23 18:32:42

iTunesIOS 10苹果

2020-04-03 14:25:55

diff Meld工具

2018-03-20 16:20:29

LinuxChromiumLibreOffice

2021-01-27 11:36:34

代码开发工具

2009-09-01 16:00:31

光纤到户中国电信光纤接入
点赞
收藏

51CTO技术栈公众号