Elasticsearch不會DSL沒事,來試試SQL吧
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實時執(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 ] [, ...] ) ) ]
大家可以在實際中自行體驗一下,也可以通過下列語句,將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在免費開源的版本是不支持的

查詢地址: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版本使用需要付費,建議在實際項目中,使用DSL或者SQL REST API操作。