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

今天我們就看下官方提供的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查詢的語法與在數據庫中使用基本一致,具體格式如下:
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 ] [, ...] ) ) ]
大家可以在實際中自行體驗一下,也可以通過下列語句,將sql轉成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相關代碼
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"));
}
執行后,報錯如下
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)
發現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操作。