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,有机会开源出来
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。