当前位置: 首页 > 科技观察

Elasticsearch不懂DSL,没关系,试试SQL

时间:2023-03-12 06:43:29 科技观察

Elasticsearch是一个分布式的,RESTful风格的搜索和数据分析引擎,可以解决各种新兴的用例,最常见的是作为搜索引擎,提供研究所有。提到Elasticsearch,就必须提到QueryDSL。DSL(DomainSpecificLanguage)是JSON请求体的形式,但是DSL的语法不是那么直观。如果你不经常使用它,你就会忘记它。当你需要它的时候,感觉很不方便。今天我们来看看官方的X-Pack,它包含一个SQL函数,可以对Elasticsearch索引执行SQL查询,并以表格形式返回结果。ElasticsearchSQL(从6.3版本开始)不仅允许针对Elasticsearch实时执行类似SQL的查询。您还可以使用REST接口,或使用JDBC,以确保任何客户端都可以使用SQL在Elasticsearch中本地搜索和聚合数据。我们可以把ElasticsearchSQL看作是一个翻译器,将SQL翻译成QueryDSL。官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/xpack-sql.html我们先用es+kabana来体验一下(安装不解释)。要构建数据,请先创建索引。注意es7.x去掉了类型,本文使用7.8.0版本的es和kabana。创建索引放入文档数据SQL查询数据SQL语法ES中使用的SQL查询语法与数据库中使用的基本相同。具体格式如下:SELECTselect_expr[,...][FROMtable_name][WHEREcondition][GROUPBYgrouping_element[,...]][HAVINGcondition][ORDERBYexpression[ASC|DESC][,...]][LIMIT[count]][PIVOT(aggregation_exprFORcolumnIN(value[[AS]alias][,...]))]可以在实践中自己尝试,也可以使用下面的语句将sql转换成DSLPOST/_sql/translate{"query":"SELECT*FROMstudentLIMIT10"}看看jdbc的运行JDBC使用SQL查询引入依赖org.elasticsearch.pluginx-pack-sql-jdbc7??.8.0注意没有maven中央仓库,需要配置仓库地址elastic.cohttps://artifacts.elastic.co/mavenjdbc相关代码Class.forName("org.elasticsearch.xpack.sql.jdbc.EsDriver");Connectionconnection=DriverManager.getConnection("jdbc:es://http://127.0.0.1:9200");语句statement=connection.createStatement();ResultSetresultSet=statement.executeQuery("selectnamefromstudent");while(resultSet.next()){System.out.println(resultSet.getString("name"));}执行后,报错如下Exceptioninthread"main"java.sql.SQLInvalidAuthorizationSpecException:currentlicenseisnon-compliantfor[jdbc]atorg.elasticsearch.xpack.sql.client.JreHttpUrlConnection$SqlExceptionType.asException(JreHttpUrlConnection.java:330)atorg.elasticsearch.xpack.sql.client.JreHttpUrlConnection。parserError(JreHttpUrlConnection.java:207)atorg.elasticsearch.xpack.sql.client.JreHttpUrlConnection.request(JreHttpUrlConnection.java:170)atorg.elasticsearch.xpack.sql.client.HttpClient.lambda$post$1(HttpClient.java:106)atorg.elasticsearch.xpack.sql.client.JreHttpUrlConnection.http(JreHttpUrlConnection.java:66)atorg.elasticsearch.xpack.sql.client.HttpClient.lambda$post$2(HttpClient.java:105)atjava.security.AccessController。doPrivileged(NativeMethod)atorg.elasticsearch.xpack.sql.client.HttpClient.post(HttpClient.java:104)atorg.elasticsearch.xpack.sql.client.HttpClient.query(HttpClient.java:81)atorg.elasticsearch.xpack.sql.jdbc.JdbcHttpClient。查询(JdbcHttpClient.java:70)atorg.elasticsearch.xpack.sql.jdbc.JdbcStatement.initResultSet(JdbcStatement.java:160)atorg.elasticsearch.xpack.sql.jdbc.JdbcStatement.execute(JdbcStatement.java:151)atorg。elasticsearch.xpack.sql.jdbc.JdbcStatement.executeQuery(JdbcStatement.java:40)atcom.ganhuojun.gracefulshutdown.configuration.Test.main(Test.java:22)发现当前许可证不符合[jdbc],说明函数Restricted,查看官网发现免费开源版本不支持jdbc。查询地址:https://www.elastic.co/cn/subscriptions如何解决?官网为我们提供了修改licenseapi的功能,去体验一些新功能https://www.elastic.co/guide/en/elasticsearch/reference/master/start-trial.html之后按照官网,执行之前的jdbc代码,可以得到正确的结果由于使用了jdbc版本付费,建议在实际项目中使用DSL或者SQLRESTAPI操作