Spring Boot与Kotlin 整合全文搜索引擎Elasticsearch的示例代码
Elasticsearch在全文搜索里面基本是无敌的,在大数据里面也很有建树,完全可以当nosql(本来也是nosql)使用。
这篇文章简单介绍SpringBoot使用Kotlin语言连接操作Elasticsearch。但是不会做很详细的介绍,如果要深入了解Elasticsearch在Java/kotlin中的使用,请参考我之前编写的《ElasticsearchJavaAPI手册》https://gitee.com/quanke/elasticsearch-java/里面包含使用实例,包含我们使用踩过的坑。
如果完全不了解Elasticsearch请先了解,安装好Elasticsearch服务
有多种方式连接Elasticsearch
- SpringDataElasticsearch
- elasticsearchJavaclient
- 其他第三方库
需要注意的是,如果使用SpringDataElasticsearch,springboot1.5++版本的不支持最新版本的elasticsearch。
下面是springdataelasticsearch和elasticsearch对应的版本
我们使用的Elasticsearch版本是5.5.6,springboot使用的版本是1.5.6而且支持Elasticsearch5.0以上的版本的springdataelasticsearch还不是RELEASE版本,所有我们采用的是elasticsearchJavaclient的方式,但是现在官方推荐更好的方式可以参考我写的《ElasticsearchJavaRestAPI手册》https://gitee.com/quanke/elasticsearch-java-rest,但是这篇文章还是使用elasticsearchJavaclient
构建SpringBootKotlin项目
如果构建项目有问题的您,可以参考我之前的文章《使用SpringBoot和Kotlin创建RESTfullAPI》
使用Gradle构建,在build.gradle文件中添加
dependencies{ compile"org.elasticsearch:elasticsearch:$elasticsearch_version" compile"org.elasticsearch.client:transport:$elasticsearch_version" }
完整的build.gradle文件
group'name.quanke.kotlin' version'1.0-SNAPSHOT' buildscript{ ext.kotlin_version='1.2.10' ext.spring_boot_version='1.5.4.RELEASE' ext.springfox_swagger2_version='2.7.0' ext.mysql_version='5.1.21' ext.mybatis_version='1.1.1' ext.elasticsearch_version='5.5.1' ext.fastjson_version='1.2.7' repositories{ mavenCentral() } dependencies{ classpath"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version") //Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件 classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version") classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version") } } applyplugin:'kotlin' applyplugin:"kotlin-spring"//Seehttps://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin applyplugin:'org.springframework.boot' applyplugin:"kotlin-jpa"//https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell jar{ baseName='chapter11-6-8-service' version='0.1.0' } repositories{ mavenCentral() } dependencies{ compile"org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" compile("org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}") compile"org.springframework.boot:spring-boot-starter-web:$spring_boot_version" compile"org.elasticsearch:elasticsearch:$elasticsearch_version" compile"org.elasticsearch.client:transport:$elasticsearch_version" compile"com.alibaba:fastjson:$fastjson_version" compile"org.apache.commons:commons-lang3:3.6" testCompile"org.springframework.boot:spring-boot-starter-test:$spring_boot_version" testCompile"org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" } compileKotlin{ kotlinOptions.jvmTarget="1.8" } compileTestKotlin{ kotlinOptions.jvmTarget="1.8" }
先写测试基类ElasticsearchClient
importcom.alibaba.fastjson.JSON importcom.alibaba.fastjson.serializer.SerializerFeature importorg.elasticsearch.action.search.SearchResponse importorg.elasticsearch.client.transport.TransportClient importorg.elasticsearch.common.settings.Settings importorg.elasticsearch.common.transport.InetSocketTransportAddress importorg.elasticsearch.transport.client.PreBuiltTransportClient importorg.junit.After importorg.junit.Before importjava.net.InetAddress /** *Elasticsearch5.5.1的client和ElasticsearchTemplate的初始化 *作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。 *Createdbyhttp://quanke.nameon2017/11/10. */ openclassElasticsearchClient{ protectedvarclient:TransportClient?=null @Before @Throws(Exception::class) funsetUp(){ valesSettings=Settings.builder() .put("cluster.name","utan-es")//设置ES实例的名称 .put("client.transport.sniff",true)//自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中 .build() /** *这里的连接方式指的是没有安装x-pack插件,如果安装了x-pack则参考[ElasticsearchXPackClient] *1.java客户端的方式是以tcp协议在9300端口上进行通信 *2.http客户端的方式是以http协议在9200端口上进行通信 */ client=PreBuiltTransportClient(esSettings) .addTransportAddress(InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"),9300)) println("ElasticsearchClient连接成功") } @After @Throws(Exception::class) funtearDown(){ if(client!=null){ client!!.close() } } protectedfunprintln(searchResponse:SearchResponse){ valsearchHits=searchResponse.hits.hits for(searchHitinsearchHits){ println(JSON.toJSONString(searchHit.source,SerializerFeature.PrettyFormat)) } } }
运行单元测试
importorg.elasticsearch.index.query.QueryBuilders.matchAllQuery importorg.junit.Test importorg.junit.runner.RunWith importorg.springframework.boot.test.context.SpringBootTest importorg.springframework.test.context.junit4.SpringRunner /** *Createdbyhttp://quanke.nameon2018/1/9. */ @RunWith(SpringRunner::class) @SpringBootTest classApplicationTests:ElasticsearchClient(){ @Test fun`estest"`(){ valqb=matchAllQuery() valresponse=client!!.prepareSearch("twitter")//可以是多个index .setTypes("tweet")//可以是多个类型 .setQuery(qb)//Query查询条件 .get() println(response) } }
我们写了一个dayu-spring-boot-starter-es,有机会开源出来
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。