Elasticsearch 是一個分布式、RESTful 風(fēng)格的搜索和數(shù)據(jù)分析引擎,能夠解決不斷涌現(xiàn)出的各種用例,最常見的是作為搜索引擎,提供項目中全文搜索。
一提到Elasticsearch,必然需要提到Query DSL,DSL(Domain Specific Language特定領(lǐng)域語言)以JSON請求體的形式,但DSL語法并沒有那么直觀,如果不經(jīng)常使用,就會遺忘,等需要用的時候,感覺非常不方便。

今天我們就看下官方提供的X-Pack,它包含一項SQL功能,可對Elasticsearch索引執(zhí)行SQL查詢并以表格格式返回結(jié)果。Elasticsearch SQL(6.3版本以后)不僅允許針對Elasticsearch實(shí)時執(zhí)行類似SQL的查詢。也可以使用REST接口,或者使用JDBC,保證任何客戶端都可以使用SQL對Elasticsearch中的數(shù)據(jù)進(jìn)行原生搜索和聚合數(shù)據(jù)。我們可以將Elasticsearch SQL看作是一種翻譯器,它可以將SQL翻譯成Query DSL。
官方說明:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/xpack-sql.html
下面我們先使用es + kabana體驗一下(安裝就不說明了)
構(gòu)建數(shù)據(jù)
先創(chuàng)建索引,注意es 7.x去掉了type,本文使用的是7.8.0版本的es和kabana。
創(chuàng)建索引

放入文檔數(shù)據(jù)
SQL查詢數(shù)據(jù)

SQL語法
在ES中使用SQL查詢的語法與在數(shù)據(jù)庫中使用基本一致,具體格式如下:
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 ] [, ...] ) ) ]
大家可以在實(shí)際中自行體驗一下,也可以通過下列語句,將sql轉(zhuǎn)成DSL
POST /_sql/translate
{
"query": "SELECT * FROM student LIMIT 10"
}
下面我們來看下jdbc的操作
JDBC使用SQL查詢
引入依賴
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>x-pack-sql-jdbc</artifactId>
<version>7.8.0</version>
</dependency>
注意該依賴maven中央倉庫沒有,需要配置倉庫地址
<repositories>
<repository>
<id>elastic.co</id>
<url>https://artifacts.elastic.co/maven</url>
</repository>
</repositories>
jdbc相關(guān)代碼
Class.forName("org.elasticsearch.xpack.sql.jdbc.EsDriver");
Connection connection = DriverManager.getConnection("jdbc:es://http://127.0.0.1:9200");
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select name from student");
while (resultSet.next()){
System.out.println(resultSet.getString("name"));
}
執(zhí)行后,報錯如下
Exception in thread "main" java.sql.SQLInvalidAuthorizationSpecException: current license is non-compliant for [jdbc]
at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection$SqlExceptionType.asException(JreHttpUrlConnection.java:330)
at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection.parserError(JreHttpUrlConnection.java:207)
at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection.request(JreHttpUrlConnection.java:170)
at org.elasticsearch.xpack.sql.client.HttpClient.lambda$post$1(HttpClient.java:106)
at org.elasticsearch.xpack.sql.client.JreHttpUrlConnection.http(JreHttpUrlConnection.java:66)
at org.elasticsearch.xpack.sql.client.HttpClient.lambda$post$2(HttpClient.java:105)
at java.security.AccessController.doPrivileged(Native Method)
at org.elasticsearch.xpack.sql.client.HttpClient.post(HttpClient.java:104)
at org.elasticsearch.xpack.sql.client.HttpClient.query(HttpClient.java:81)
at org.elasticsearch.xpack.sql.jdbc.JdbcHttpClient.query(JdbcHttpClient.java:70)
at org.elasticsearch.xpack.sql.jdbc.JdbcStatement.initResultSet(JdbcStatement.java:160)
at org.elasticsearch.xpack.sql.jdbc.JdbcStatement.execute(JdbcStatement.java:151)
at org.elasticsearch.xpack.sql.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:40)
at com.ganhuojun.gracefulshutdown.configuration.Test.main(Test.java:22)
發(fā)現(xiàn)current license is non-compliant for [jdbc],說明功能被限制,查詢下官網(wǎng)發(fā)現(xiàn),jdbc在免費(fèi)開源的版本是不支持的

查詢地址:https://www.elastic.co/cn/subscriptions
那怎么解決呢?
官網(wǎng)提供了我們修改license api的功能,去體驗一些新的功能
https://www.elastic.co/guide/en/elasticsearch/reference/master/start-trial.html
按照官網(wǎng)操作后,執(zhí)行前面的jdbc代碼,可以得到正確結(jié)果

由于jdbc版本使用需要付費(fèi),建議在實(shí)際項目中,使用DSL或者SQL REST API操作。