# elasticsearch-jdbc **Repository Path**: chenzhenguo/elasticsearch-jdbc ## Basic Information - **Project Name**: elasticsearch-jdbc - **Description**: elasticsearch-jdbc,在elasticsearch-sql的jdbc实验特性基础上完成,可使用sql和rest api的方式执行elasticsearch操作 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2019-12-18 - **Last Updated**: 2025-01-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # elasticsearch-jdbc 2.0.x版本最先是在[elasticsearch-sql](https://github.com/NLPchina/elasticsearch-sql)的[实验特性项目](https://github.com/NLPchina/elasticsearch-sql/pull/283)的基础上修改而来,修改和补充了部分jdbc规范,使之能够和mybatis结合,sql支持度可参考elasticsearch-sql,引入了[jest](https://github.com/searchbox-io/Jest),实现了mybatis+rest api的方式操作elasticsearch。提供了Java api的工具类`ESUtil`和rest api工具类`JestUtil`。 由于和Druid数据库连接池耦合太大,在使用过程中发现了一系列问题,决定将JDBC和数据库连接池解耦。添加ElasticSearchDriver类可以直接使用Class.forName加载驱动。 3.0.0版本不再使用elasticsearch-sql实验项目关于数据库连接池的部分,依旧沿用sql解析部分的代码 ### Upgrade 3.0.1 TransportClient 增加心跳监测,解决连接超时的问题。增加集群名配置 ### 使用方式 #### maven依赖 ```xml wjj-maven-repo https://raw.github.com/zhanyingf15/maven-repo/master ``` 上面是在GitHub上搭建的私人仓库 ```xml com.wjj elasticsearch-jdbc 3.0.0 ``` #### application.xml ```xml classpath*:com/**/model/es/*.xml ``` #### 添加elasticsearch.properties 配置文件到classpath elasticsearch.properties配置文件是必须的,可以直接如上面代码引入到spring配置文件中。java.url是TransportClient的地址,http.url是REST接口地址 ```properties #es java TransportClient address,split by "," if have multi address,eg.jdbc:elasticsearch://ip1:port,ip2:port java.url=jdbc:elasticsearch://192.168.70.128:9300 #es rest http address,split by "," if have multi address.eg http://ip1:port,http://ip2:port http.url=http://192.168.70.128:9200 #max connection number maxActive=20 #cluster name,ignored if you not setting cluster.name=elasticsearch ``` #### 在mybatis中使用sql和rest api操作 ```xml PUT ${index}/${type}/${_id}?op_type=create { "id":"${id}", "name":"${name}" } POST ${index}/${type}/${id}/_update? { "doc": { "name": "${name}" } } DELETE ${index}/${type}/${id} ``` 上面基本列出了CRUD操作,为了方便描述,xml中的内容统称为restBody,以修改为例,`POST`为协议,`index/type/id/_update`为uri,`?`和第一个`{`间的内容为参数(即添加示例中的op_type=create,可选),`{xxx}`为restMapping,这个就是发到elasticsearch的结构体(JSON字符串)。 协议的不同,uri也会不同,参数都是可选的,协议与uri的关系如下: - PUT:insert操作。 uri必须含有index/type[/id],id可选,默认使用es的自增长id,restMapping不能为空 - POST:select或update操作。 如果是update,uri必须满足`index/type/id/_update`格式。id可以传入多个批量更新(如更新多个文档的state),使用英文`,`分隔 如果是select,index/type都是可选,也可以传入多个index和type,用英文`,`分隔,如:index1,index2/type1,type2/_search,不能有id,必须带_search,所以select操作只能是下面几种uri - `_search`:不指定index和type - `index/_search`:只指定index - `index/type/_search`:同时指定index和type - DELETE:delete操作。 uri必须满足`index/type/id`这种格式。id可以传入多个批量删除,使用英文`,`分隔,不能根据条件删除,所以传入restMapping是无效的 - GET:通过文档id获取。 只能通过单个文档id获取,,uri必须满足`index/type/id`格式,只能指定一个id,如果需要同时通过多个id查询,使用[idsQuery](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-ids-query.html),传入restMapping无效。 > 协议不区分大小写,参数可选。但是无论是否有参数,只要有restMapping,`?`必须带上 **注意** 所有的增删改查都可以包裹在``中,都可以在java中通过以下方式获取结果 ```java Map result = session.selectOne("xxx",param); //如果是增、删、改操作。 JestResult result = JestUtil.getExecuteResult(result); //如果是查询 SearchResult result = JestUtil.getQueryResult(result); ``` 如果增删改是包裹在对应的``、``和``中,通过session.insert、session.update、session.delete操作返回的整形数字不是关系型数据库中影响的行数,而是http状态码,2xx系列状态码表示操作成功,如果操作失败,并不会返回具体的错误信息,程序也不会报错。如果需要具体的操作信息,只能使用`