All Projects → zhanyingf15 → elasticsearch-jdbc

zhanyingf15 / elasticsearch-jdbc

Licence: other
elasticsearch-jdbc,在elasticsearch-sql的jdbc实验特性基础上完成,可使用sql和rest api的方式执行elasticsearch操作

Programming Languages

java
68154 projects - #9 most used programming language

Projects that are alternatives of or similar to elasticsearch-jdbc

springboot-learning-demo
springboot学习示例
Stars: ✭ 17 (-15%)
Mutual labels:  mybatis
thymeleaf-scripting
Thymeleaf scripting plugin for MyBatis
Stars: ✭ 16 (-20%)
Mutual labels:  mybatis
carina
Carina automation framework: Web, Mobile, API, DB etc testing...
Stars: ✭ 652 (+3160%)
Mutual labels:  mybatis
Student-Information-Administration-System
大学生信息管理系统——初学路上自己摸索实践的项目
Stars: ✭ 91 (+355%)
Mutual labels:  mybatis
hqc mp
微信小程序+微信管理后台+微信用户前台
Stars: ✭ 69 (+245%)
Mutual labels:  mybatis
spring-sharding-mybaits
mybatis3在spring中的分库分表
Stars: ✭ 24 (+20%)
Mutual labels:  mybatis
LSFramework
手写山寨版spring学习aop、ioc思想的demo,没看过spring的源码,因为实在是太庞大了,参考部分网上博客及开源代码完成。
Stars: ✭ 53 (+165%)
Mutual labels:  mybatis
black-postoffice
[무신사 신입] 익명으로 편하게 고민, 일상을 공유하는 소셜 네트워크 서비스입니다.
Stars: ✭ 31 (+55%)
Mutual labels:  mybatis
anyangdp-frame
基于mybatis,springboot,tk.mybatis等框架二次开发,实现crud,controller,service,dao。
Stars: ✭ 16 (-20%)
Mutual labels:  mybatis
Programmer-Learning-materials
程序员 学习资料,以及一些书籍电子书,如果对您有所帮助,还希望大家多多star,更多资料请关注《Java有货》微信公众号获取
Stars: ✭ 140 (+600%)
Mutual labels:  mybatis
sqle
SQLE is a SQL audit platform | SQLE 是一个支持多场景,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具
Stars: ✭ 731 (+3555%)
Mutual labels:  mybatis
app
本科期间写的一些应用程序
Stars: ✭ 40 (+100%)
Mutual labels:  mybatis
JavaFamily
【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。
Stars: ✭ 517 (+2485%)
Mutual labels:  mybatis
DAFramework
云南数聚基础框架
Stars: ✭ 25 (+25%)
Mutual labels:  mybatis
zealsay backend
Spring Boot 快速开发脚手架,以博客论坛为示例展示,后台主要使用Spring Boot,Spring Security,Mybatis-plus,redis token,前端使用Nuxt,Vue,Vuex,Vue-Router,Vuetify。
Stars: ✭ 58 (+190%)
Mutual labels:  mybatis
atguigu ssm crud
Atguigu-SSM-CRUD 一个最基本的CRUD系统,采用IDEA+Maven搭建,具备前后端交互功能,前端采用BootStrap+Ajax异步请求DOM渲染,后端采用SpringMVC+MyBatis+Mysql8.0+Servlet+Jsp,符合REST风格URL规范,并加入了Hibernate提供的数据校验功能,支持PageHelper的分页功能,很适合SSM阶段性练习。同时用到了很多前端操作以及BootStrap组件,也有利于学习JS和前端框架。
Stars: ✭ 52 (+160%)
Mutual labels:  mybatis
CrazyCar
网络联机游戏解决方案---Unity制作的联机赛车游戏,服务端为SpringBoot + Mybatis;后台为Vue + Element;游戏端采用QFramework框架,支持KCP和WebSocket网络(商用级)
Stars: ✭ 672 (+3260%)
Mutual labels:  mybatis
AllInOneFX
All In One JavaFX Application with a curated list of awesome JavaFX libraries, frameworks
Stars: ✭ 26 (+30%)
Mutual labels:  mybatis
huanhuan-blog
一个java版本freemarker的小博客项目
Stars: ✭ 19 (-5%)
Mutual labels:  mybatis
wangxin-study
浪树学习考试系统(wangxin-education)[课程点播、直播、刷题、考试、支付、营销],致力打造一个低成本通用的在线教育系统,让用户直接通过系统可视化配置并尽可能无须修改任何代码即可实现上线商用。系统采用前后端分离模式,前台和移动端采用vue.js为核心框架,后台采用Java语言,框架springboot+spring+mybatis+redis+mysql。系统目前主要功能有课程点播、直播、练习、考试、支付、营销等功能。
Stars: ✭ 267 (+1235%)
Mutual labels:  mybatis

elasticsearch-jdbc

2.0.x版本最先是在elasticsearch-sql实验特性项目的基础上修改而来,修改和补充了部分jdbc规范,使之能够和mybatis结合,sql支持度可参考elasticsearch-sql,引入了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依赖

<repositories>
    <repository>
      <id>wjj-maven-repo</id>
      <url>https://raw.github.com/zhanyingf15/maven-repo/master</url>
    </repository>
</repositories>

上面是在GitHub上搭建的私人仓库

<dependency>
  <groupId>com.wjj</groupId>
  <artifactId>elasticsearch-jdbc</artifactId>
  <version>3.0.0</version>
</dependency>

application.xml

<bean id="defaulteDataSource-es" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
		<property name="driverClassName" value="com.wjj.jdbc.elasticsearch.ElasticSearchDriver" />
		<property name="url" value="${java.url}" />
		<property name="initialSize" value="2" />
		<property name="minIdle" value="2" />
		<property name="maxActive" value="${maxActive}" />
		<property name="maxWait" value="60000" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="validationQuery" value="select 1 from dual" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="poolPreparedStatements" value="false" />
		<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
		<property name="removeAbandoned" value="true" />
		<property name="removeAbandonedTimeout" value="1800" />
		<property name="logAbandoned" value="true" />
		<property name="filters" value="stat,log4j" />
		<property name="connectionProperties" value="druid.stat.slowSqlMillis=5000" />
	</bean>
	<bean id="defaultSQLSessionFactory-es" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="defaulteDataSource-es" />
		<property name="configLocation" value="classpath:mybatis-config.xml"></property>
		<property name="mapperLocations">
			<array>
				<value>classpath*:com/**/model/es/*.xml</value>
			</array>
		</property>
	</bean>
	<bean id="defaultSQLSessionTemplate-es" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg index="0" ref="defaultSQLSessionFactory-es" />
	</bean>
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name = "dataSource" ref="defaulteDataSource-es"/>
	</bean>

添加elasticsearch.properties 配置文件到classpath

elasticsearch.properties配置文件是必须的,可以直接如上面代码引入到spring配置文件中。java.url是TransportClient的地址,http.url是REST接口地址

#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操作

<!-- query data from oracle database -->
<select id="qryOracleList" parameterType="java.lang.Object" resultType="java.util.HashMap">
  SELECT * FROM testTable 
</select>
<!--query or update data by rest api -->
<!--add-->
<insert id="jestInsert" parameterType="java.lang.Object">
	PUT ${index}/${type}/${_id}?op_type=create
	{
		"id":"${id}",
		"name":"${name}"
	}
</insert>
<!--search-->
<select id="qryTest2" parameterType="java.lang.Object" resultType="java.util.HashMap">
	POST ${index}/${type}/_search?
	{
		"query": {
			"prefix": {
				"name": "te"
			}
		}
	}
</select>

<!--query demo2,query data by _id-->
<select id="qryTest2" parameterType="java.lang.Object" resultType="java.util.HashMap">
	GET ${index}/${type}/${id}
</select>

<!--update-->
<update id="jestUpdate" parameterType="java.lang.Object">
	POST ${index}/${type}/${id}/_update?
	{
		"doc": {
			"name": "${name}"
		}
	}
</update>
<!--delete-->
<delete id="jestDeletee" parameterType="java.lang.Object">
	DELETE ${index}/${type}/${id}
</delete>

上面基本列出了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,传入restMapping无效。

协议不区分大小写,参数可选。但是无论是否有参数,只要有restMapping,?必须带上

注意 所有的增删改查都可以包裹在<select>中,如果是包裹在<select>中,都可以在java中通过以下方式获取结果

Map result = session.selectOne("xxx",param);
//如果是增、删、改操作。
JestResult result = JestUtil.getExecuteResult(result);
//如果是查询
SearchResult result = JestUtil.getQueryResult(result);

如果增删改是包裹在对应的<insert><update><delete>中,通过session.insert、session.update、session.delete操作返回的整形数字不是关系型数据库中影响的行数,而是http状态码,2xx系列状态码表示操作成功,如果操作失败,并不会返回具体的错误信息,程序也不会报错。如果需要具体的操作信息,只能使用<select>包裹,返回JestResult对象,再调用相应的方法获取具体信息。

操作elasticsearch时,在mybatis的xml中只能使用${}而不是#{},因为elasticsearch并不是数据库,并没有数据库元数据,后续考虑会构建一个elasticsearch的元数据对象。

测试

service业务层

@Resource(name = "defaultSQLSessionTemplate-es")
protected SqlSessionTemplate sessionES;
public Map<String,Object> qryJest(Map param){
        Map result = new HashMap<>();
        JestResult jestResult = JestUtil.getQueryResult(sessionES.selectOne("es.qryTest2",param));
        result.put("data_list",jestResult.getSourceAsObjectList(Map.class));
        return result;
}

main方法

ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ac.start();
SqlSessionTemplate esSession = SpringBeanUtil.getInstance().getBean("defaultSQLSessionTemplate-es",SqlSessionTemplate.class);
ESTestServiceImpl esTestService = SpringBeanUtil.getInstance().getBean("esTestService",ESTestServiceImpl.class);
Map param = new HashMap();
param.put("index","radiott");
param.put("type","artiststt");
param.put("name","te");
Map result = esTestService.qryJest(param);

JDBC测试

Class.forName("com.wjj.jdbc.elasticsearch.ElasticSearchDriver");
Connection conn = DriverManager.getConnection("jdbc:elasticsearch://192.168.70.128:9300");
PreparedStatement stmt = conn.prepareStatement("select * from bank");
ResultSet rs = stmt.executeQuery();
while (rs.next()){
    System.out.println("firstname:"+rs.getString("firstname")+",balance:"+rs.getInt("balance"));
}

如果单独使用rest api时不需要创建连接,也可以不创建数据源(需要手动调用initJestClient()初始化客户端)

public static void testRest() throws Exception{
    //properties就是elasticsearch.properties的配置内容,可以传null,默认从配置文件读取
    JestUtil.initJestClient(properties);
    String restStr = "{ " +
                     " \"query\":{" +
                     "   \"term\":{ " +
                     "       \"firstname\":\"effie\"" +
                     "     }" +
                     "   }" +
                     "}";
    SearchResult result = JestUtil.query(restStr,new String[]{"bank"},new String[]{"account"});
    List<SearchResult.Hit<Map,Void>> list = result.getHits(Map.class);
    for(SearchResult.Hit<Map,Void> hit:list){
        Iterator<Map.Entry<String,Object>> i = hit.source.entrySet().iterator();
        while(i.hasNext()){
            Map.Entry<String,Object> entry = i.next();
            System.out.println(entry.getKey()+":"+entry.getValue());
        }

    }
}
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].