├── README.md ├── pom.xml └── src └── main ├── java └── com │ └── wjj │ └── jdbc │ ├── elasticsearch │ ├── ElasticSearchConnection.java │ ├── ElasticSearchDatabaseMetaData.java │ ├── ElasticSearchDriver.java │ ├── ElasticSearchPreparedStatement.java │ ├── ElasticSearchSqlResultSet.java │ └── ElasticSearchSqlResultSetMetaDataBase.java │ ├── jest │ ├── JestMetaData.java │ ├── JestResultSet.java │ ├── JestType.java │ └── JestUtil.java │ ├── schedule │ ├── ESClient.java │ └── HeartBeatsSchedule.java │ ├── test │ └── Test.java │ └── util │ ├── ESUtil.java │ ├── ElasticsearchField.java │ ├── ElasticsearchTypes.java │ ├── LOG.java │ └── PropertiesUtil.java └── resources ├── META-INF └── services │ └── java.sql.Driver └── log4j.properties /README.md: -------------------------------------------------------------------------------- 1 | # elasticsearch-jdbc 2 | 3 | 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`。 4 | 5 | 由于和Druid数据库连接池耦合太大,在使用过程中发现了一系列问题,决定将JDBC和数据库连接池解耦。添加ElasticSearchDriver类可以直接使用Class.forName加载驱动。 6 | 7 | 3.0.0版本不再使用elasticsearch-sql实验项目关于数据库连接池的部分,依旧沿用sql解析部分的代码 8 | ### Upgrade 9 | 3.0.1 TransportClient 增加心跳监测,解决连接超时的问题。增加集群名配置 10 | ### 使用方式 11 | 12 | #### maven依赖 13 | 14 | ```xml 15 | 16 | 17 | wjj-maven-repo 18 | https://raw.github.com/zhanyingf15/maven-repo/master 19 | 20 | 21 | ``` 22 | 上面是在GitHub上搭建的私人仓库 23 | ```xml 24 | 25 | com.wjj 26 | elasticsearch-jdbc 27 | 3.0.0 28 | 29 | ``` 30 | 31 | #### application.xml 32 | 33 | ```xml 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | classpath*:com/**/model/es/*.xml 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | ``` 71 | 72 | 73 | #### 添加elasticsearch.properties 配置文件到classpath 74 | elasticsearch.properties配置文件是必须的,可以直接如上面代码引入到spring配置文件中。java.url是TransportClient的地址,http.url是REST接口地址 75 | 76 | 77 | ```properties 78 | #es java TransportClient address,split by "," if have multi address,eg.jdbc:elasticsearch://ip1:port,ip2:port 79 | java.url=jdbc:elasticsearch://192.168.70.128:9300 80 | #es rest http address,split by "," if have multi address.eg http://ip1:port,http://ip2:port 81 | http.url=http://192.168.70.128:9200 82 | #max connection number 83 | maxActive=20 84 | #cluster name,ignored if you not setting 85 | cluster.name=elasticsearch 86 | ``` 87 | 88 | 89 | 90 | #### 在mybatis中使用sql和rest api操作 91 | 92 | ```xml 93 | 94 | 97 | 98 | 99 | 100 | PUT ${index}/${type}/${_id}?op_type=create 101 | { 102 | "id":"${id}", 103 | "name":"${name}" 104 | } 105 | 106 | 107 | 117 | 118 | 119 | 122 | 123 | 124 | 125 | POST ${index}/${type}/${id}/_update? 126 | { 127 | "doc": { 128 | "name": "${name}" 129 | } 130 | } 131 | 132 | 133 | 134 | DELETE ${index}/${type}/${id} 135 | 136 | ``` 137 | 138 | 上面基本列出了CRUD操作,为了方便描述,xml中的内容统称为restBody,以修改为例,`POST`为协议,`index/type/id/_update`为uri,`?`和第一个`{`间的内容为参数(即添加示例中的op_type=create,可选),`{xxx}`为restMapping,这个就是发到elasticsearch的结构体(JSON字符串)。 139 | 140 | 协议的不同,uri也会不同,参数都是可选的,协议与uri的关系如下: 141 | 142 | - PUT:insert操作。 143 | uri必须含有index/type[/id],id可选,默认使用es的自增长id,restMapping不能为空 144 | - POST:select或update操作。 145 | 如果是update,uri必须满足`index/type/id/_update`格式。id可以传入多个批量更新(如更新多个文档的state),使用英文`,`分隔 146 | 如果是select,index/type都是可选,也可以传入多个index和type,用英文`,`分隔,如:index1,index2/type1,type2/_search,不能有id,必须带_search,所以select操作只能是下面几种uri 147 | - `_search`:不指定index和type 148 | - `index/_search`:只指定index 149 | - `index/type/_search`:同时指定index和type 150 | - DELETE:delete操作。 151 | uri必须满足`index/type/id`这种格式。id可以传入多个批量删除,使用英文`,`分隔,不能根据条件删除,所以传入restMapping是无效的 152 | - GET:通过文档id获取。 153 | 只能通过单个文档id获取,,uri必须满足`index/type/id`格式,只能指定一个id,如果需要同时通过多个id查询,使用[idsQuery](https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-ids-query.html),传入restMapping无效。 154 | 155 | > 协议不区分大小写,参数可选。但是无论是否有参数,只要有restMapping,`?`必须带上 156 | 157 | **注意** 158 | 所有的增删改查都可以包裹在``中,都可以在java中通过以下方式获取结果 159 | 160 | ```java 161 | Map result = session.selectOne("xxx",param); 162 | //如果是增、删、改操作。 163 | JestResult result = JestUtil.getExecuteResult(result); 164 | //如果是查询 165 | SearchResult result = JestUtil.getQueryResult(result); 166 | ``` 167 | 168 | 如果增删改是包裹在对应的``、``和``中,通过session.insert、session.update、session.delete操作返回的整形数字不是关系型数据库中影响的行数,而是http状态码,2xx系列状态码表示操作成功,如果操作失败,并不会返回具体的错误信息,程序也不会报错。如果需要具体的操作信息,只能使用`