Spring Boot与Kotlin 整合全文搜索引擎Elasticsearch

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.6spring 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相关内容

欢迎关注《Spring Boot 与 kotlin 实战》

全科龙婷

参考

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )