Elasticsearch 的官方查询语言是 Query DSL,既然是官方指定的,说明最吻合 ES 的强大功能,为ES做支撑。那么我们为什么还用 SQL 查询?这是否是多此一举了呢?
其实,存在毕竟有存在的道理,存在即合理。SQL 作为一个数据库查询语言,它语法简洁,书写方便而且大部分服务端程序员都清楚了解和熟知它的写法。但是作为一个 ES 萌新来说,就算他已经是一位编程界的老江湖,但是如果他不熟悉 ES ,那么他如果要使用公司已经搭好的 ES 服务,他必须要先学习 Query DSL,学习成本也是一项影响技术开发进度的因素而且不稳定性高。但是如果 ES 查询支持 SQL的话,那么也许就算他是工作一两年的同学,他虽然不懂 ES的复杂概念,他也能很好的使用 ES 而且顺利的参加到开发的队伍中,毕竟SQL 谁不会写呢?
我们正式介绍下我们的主角 - Elasticsearch-SQL,Elasticsearch-SQL不属于 Elasticsearch 官方的,它是 NLPChina(中国自然语言处理开源组织)开源的一个 ES 插件,主要功能是通过 SQL 来查询 ES,其实它的底层是通过解释 SQL,将SQL 转换为 DSL 语法,再通过DSL 查询。
Elasticsearch-SQL目前已经支持大概所有版本的 ES,而且最近的7.17.4的也在支持的范围了,所以可以看得出来维护的还是蛮频繁的。
但是:这个项目已经不维护了,具体啥原因不知道,可能是es官方出了自己的x-pack-sql(收费的,后续介绍)
github地址:https://github.com/NLPchina/elasticsearch-sql/
维基百科:https://github.com/NLPchina/elasticsearch-sql/wiki
在 5.0之前的安装方式为:plugin install
./bin/plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/2.4.6.0/elasticsearch-sql-2.4.6.0.zip
在5.0之后(包括6.x)的安装方式为:elasticsearch-plugin install
./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/5.0.1/elasticsearch-sql-5.0.1.0.zip
如:7.8.0版本为:
./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/7.8.0.0/elasticsearch-sql-7.8.0.0.zip
如果我们安装不成功,我们可以直接下载 Elasticsearch-SQL插件的压缩包,然后解压,完成之后重命名文件夹为 sql ,放到 ES 的安装路径的 plugins目录中,例如:…\elasticsearch-7.8.0\plugins\sql。
然后记得重启
http://localhost:9200/_plugin/sql/
在 elasticsearch 5.x/6.x 上,使用 elasticsearch sql site chrome https://github.com/shi-yuan/elasticsearch-sql-site-chrome扩展(确保在 elasticsearch.yml 上启用 cors)。
然后就可以通过扩展器插件进行链接:
下载staandalone
unzip es-sql-site-standalone.zip
cd site-server/
npm install express --save
也可以更改standalone启动端口
vi site_configuration.json
es安装了sql插件后,就可以使用httprest进行查询
请注意:从7.5.0.0开始,之前使用的一些查询路径进行了更改
/_sql?sql= 改为_nlpcn/sql?sql= (这是执行查询sql的)
_sql/_explain?sql= 改为 _nlpcn/sql/explain?sql= (这是讲sql翻译为dcl语句的)
直接在web前端页面上写sql即可,支持常规的sql语法
只不多表名 tableName 的地方现在改为了索引名 indexName
从maven中央仓库找,但是不一定能找到所有版本的
如果没找到,去我们当时下载的那个插件哪里有,可以自行导入
package es_sql;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.ElasticSearchDruidDataSourceFactory;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* @author wkl
* @create 2022-06-30 14:23
*/
public class ESjdbsSql {
//这是我提前创建的索引名称,里面有数据
private static final String indexName = "user";
@Test
public void esJdbc()