Elasticsearch 在全文搜索里面基本是无敌的,在大数据里面也很有建树,完全可以当nosql(本来也是nosql)使用。
这篇文章简单介绍Spring Boot使用Kotlin语言连接操作 Elasticsearch。但是不会做很详细的介绍,如果要深入了解Elasticsearch在Java/kotlin中的使用,请参考我之前编写的《Elasticsearch Java API 手册》 https://gitee.com/quanke/elasticsearch-java/ 里面包含使用实例,包含我们使用踩过的坑。
如果完全不了解Elasticsearch请先了解,安装好Elasticsearch服务
有多种方式连接Elasticsearch
- Spring Data Elasticsearch
- elasticsearch Java client
- 其他第三方库
需要注意的是,如果使用Spring Data Elasticsearch,spring boot 1.5++版本的不支持最新版本的elasticsearch。
下面是spring data elasticsearch 和elasticsearch对应的版本
spring data elasticsearch
elasticsearch
3.0.0.RC2
5.5.0
3.0.0.M4
5.4.0
2.0.4.RELEASE
2.4.0
2.0.0.RELEASE
2.2.0
1.4.0.M1
1.7.3
1.3.0.RELEASE
1.5.2
1.2.0.RELEASE
1.4.4
1.1.0.RELEASE
1.3.2
1.0.0.RELEASE
1.1.1
我们使用的Elasticsearch版本是5.5.6,spring boot 使用的版本是1.5.6 而且支持Elasticsearch5.0 以上的版本的spring data elasticsearch还不是RELEASE版本,所有我们采用的是elasticsearch Java client的方式,但是现在官方推荐更好的方式可以参考我写的《Elasticsearch Java Rest API 手册》 https://gitee.com/quanke/elasticsearch-java-rest,但是这篇文章还是使用elasticsearch Java client
构建Spring Boot Kotlin 项目
如果构建项目有问题的您,可以参考我之前的文章《使用Spring Boot和Kotlin创建RESTfull API》
使用Gradle构建,在build.gradle文件中添加
1dependencies { 2 compile "org.elasticsearch:elasticsearch:$elasticsearch_version" 3 compile "org.elasticsearch.client:transport:$elasticsearch_version" 4}
完整的build.gradle文件
1group 'name.quanke.kotlin' 2version '1.0-SNAPSHOT' 3 4buildscript { 5 ext.kotlin_version = '1.2.10' 6 ext.spring_boot_version = '1.5.4.RELEASE' 7 ext.springfox_swagger2_version = '2.7.0' 8 ext.mysql_version = '5.1.21' 9 ext.mybatis_version = '1.1.1' 10 ext.elasticsearch_version = '5.5.1' 11 ext.fastjson_version = '1.2.7' 12 repositories { 13 mavenCentral() 14 } 15 dependencies { 16 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 17 classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version") 18 19// Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件 20 classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version") 21 classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version") 22 } 23} 24 25apply plugin: 'kotlin' 26apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin 27apply plugin: 'org.springframework.boot' 28apply plugin: "kotlin-jpa" //https://stackoverflow.com/questions/32038177/kotlin-with-jpa-default-constructor-hell 29jar { 30 baseName = 'chapter11-6-8-service' 31 version = '0.1.0' 32} 33repositories { 34 mavenCentral() 35} 36 37 38dependencies { 39 compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" 40 compile("org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}") 41 42 compile "org.springframework.boot:spring-boot-starter-web:$spring_boot_version" 43 compile "org.elasticsearch:elasticsearch:$elasticsearch_version" 44 compile "org.elasticsearch.client:transport:$elasticsearch_version" 45 compile "com.alibaba:fastjson:$fastjson_version" 46 compile "org.apache.commons:commons-lang3:3.6" 47 48 49 testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version" 50 testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" 51 52} 53 54compileKotlin { 55 kotlinOptions.jvmTarget = "1.8" 56} 57compileTestKotlin { 58 kotlinOptions.jvmTarget = "1.8" 59}
先写测试基类ElasticsearchClient
1import com.alibaba.fastjson.JSON 2import com.alibaba.fastjson.serializer.SerializerFeature 3import org.elasticsearch.action.search.SearchResponse 4import org.elasticsearch.client.transport.TransportClient 5import org.elasticsearch.common.settings.Settings 6import org.elasticsearch.common.transport.InetSocketTransportAddress 7import org.elasticsearch.transport.client.PreBuiltTransportClient 8import org.junit.After 9import org.junit.Before 10 11import java.net.InetAddress 12 13/** 14 * Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化 15 * 作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。 16 * Created by http://quanke.name on 2017/11/10. 17 */ 18open class ElasticsearchClient { 19 20 protected var client: TransportClient? = null 21 22 @Before 23 @Throws(Exception::class) 24 fun setUp() { 25 26 val esSettings = Settings.builder() 27 .put("cluster.name", "utan-es") //设置ES实例的名称 28 .put("client.transport.sniff", true) //自动嗅探整个集群的状态,把集群中其他ES节点的ip添加到本地的客户端列表中 29 .build() 30 31 /** 32 * 这里的连接方式指的是没有安装x-pack插件,如果安装了x-pack则参考 [ElasticsearchXPackClient] 33 * 1. java客户端的方式是以tcp协议在9300端口上进行通信 34 * 2. http客户端的方式是以http协议在9200端口上进行通信 35 */ 36 client = PreBuiltTransportClient(esSettings) 37 .addTransportAddress(InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300)) 38 39 println("ElasticsearchClient 连接成功") 40 } 41 42 @After 43 @Throws(Exception::class) 44 fun tearDown() { 45 if (client != null) { 46 client!!.close() 47 } 48 49 } 50 51 protected fun println(searchResponse: SearchResponse) { 52 val searchHits = searchResponse.hits.hits 53 for (searchHit in searchHits) { 54 println(JSON.toJSONString(searchHit.source, SerializerFeature.PrettyFormat)) 55 } 56 } 57 58} 59 60
运行单元测试
1import org.elasticsearch.index.query.QueryBuilders.matchAllQuery 2import org.junit.Test 3import org.junit.runner.RunWith 4import org.springframework.boot.test.context.SpringBootTest 5import org.springframework.test.context.junit4.SpringRunner 6 7 8/** 9 * Created by http://quanke.name on 2018/1/9. 10 */ 11@RunWith(SpringRunner::class) 12@SpringBootTest 13class ApplicationTests : ElasticsearchClient() { 14 15 @Test 16 fun `es test"`() { 17 18 val qb = matchAllQuery() 19 20 val response = client!!.prepareSearch("twitter")//可以是多个index 21 .setTypes("tweet")//可以是多个类型 22 .setQuery(qb) // Query 查询条件 23 .get() 24 25 println(response) 26 27 } 28 29} 30 31
我们写了一个dayu-spring-boot-starter-es ,有机会开源出来
更多Spring Boot 和 kotlin相关内容