Spring Boot与Kotlin 整合全文搜索引擎Elasticsearch的示例代码

作者:quanke 时间:2023-03-18 11:57:58 

Elasticsearch 在全文搜索里面基本是无敌的,在大数据里面也很有建树,完全可以当nosql(本来也是nosql)使用。

这篇文章简单介绍Spring Boot使用Kotlin语言连接操作 Elasticsearch。但是不会做很详细的介绍,如果要深入了解Elasticsearch在Java/kotlin中的使用,请参考我之前编写的《Elasticsearch Java API 手册》 https://gitee.com/quanke/elasticsearch-java/ 里面包含使用实例,包含我们使用踩过的坑。

如果完全不了解Elasticsearch请先了解,安装好Elasticsearch服务

有多种方式连接Elasticsearch

  1. Spring Data Elasticsearch

  2. elasticsearch Java client

  3. 其他第三方库

需要注意的是,如果使用Spring Data Elasticsearch,spring boot 1.5++版本的不支持最新版本的elasticsearch。

下面是spring data elasticsearch 和elasticsearch对应的版本

spring data elasticsearchelasticsearch
3.0.0.RC25.5.0
3.0.0.M45.4.0
2.0.4.RELEASE2.4.0
2.0.0.RELEASE2.2.0
1.4.0.M11.7.3
1.3.0.RELEASE1.5.2
1.2.0.RELEASE1.4.4
1.1.0.RELEASE1.3.2
1.0.0.RELEASE1.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 文件中添加


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")
}
}

apply plugin: 'kotlin'
apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
apply plugin: 'org.springframework.boot'
apply plugin: "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


import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.serializer.SerializerFeature
import org.elasticsearch.action.search.SearchResponse
import org.elasticsearch.client.transport.TransportClient
import org.elasticsearch.common.settings.Settings
import org.elasticsearch.common.transport.InetSocketTransportAddress
import org.elasticsearch.transport.client.PreBuiltTransportClient
import org.junit.After
import org.junit.Before
import java.net.InetAddress

/**
* Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化
* 作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。
* Created by http://quanke.name on 2017/11/10.
*/
open class ElasticsearchClient {

protected var client: TransportClient? = null
@Before
@Throws(Exception::class)
fun setUp() {
 val esSettings = 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)
fun tearDown() {
 if (client != null) {
  client!!.close()
 }

}

protected fun println(searchResponse: SearchResponse) {
 val searchHits = searchResponse.hits.hits
 for (searchHit in searchHits) {
  println(JSON.toJSONString(searchHit.source, SerializerFeature.PrettyFormat))
 }
}
}

运行单元测试


import org.elasticsearch.index.query.QueryBuilders.matchAllQuery
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner
/**
* Created by http://quanke.name on 2018/1/9.
*/
@RunWith(SpringRunner::class)
@SpringBootTest
class ApplicationTests : ElasticsearchClient() {

@Test
fun `es test"`() {
 val qb = matchAllQuery()
 val response = client!!.prepareSearch("twitter")//可以是多个index
   .setTypes("tweet")//可以是多个类型
   .setQuery(qb) // Query 查询条件
   .get()
 println(response)
}
}

我们写了一个 dayu-spring-boot-starter-es ,有机会开源出来

来源:https://www.jianshu.com/p/02d556b470ff

标签:SpringBoot,Kotlin,Elasticsearch
0
投稿

猜你喜欢

  • C#中的多播委托和泛型委托

    2022-03-23 19:17:28
  • Struts2中异常处理机制分析

    2023-11-17 21:54:32
  • SpringBoot项目为何引入大量的starter?如何自定义starter?

    2022-12-28 21:39:02
  • Java创建型设计模式之抽象工厂模式(Abstract Factory)

    2022-08-31 01:25:56
  • 微信第三方登录Android实现代码

    2023-07-27 08:05:49
  • springboot-curd基于mybatis项目搭建

    2023-12-08 10:41:05
  • Jenkins安装以及邮件配置详解

    2023-04-20 12:42:39
  • 详解tryAcquire()、addWaiter()、acquireQueued()

    2022-07-30 10:24:05
  • 使用AccessibilityService实现自动遍历点赞功能

    2023-10-18 16:22:53
  • Spring Cloud Gateway 默认的filter功能和执行顺序介绍

    2021-07-01 21:31:46
  • Android日期显示和日期选择库

    2021-09-04 10:54:17
  • Java Selenium实现多窗口切换的示例代码

    2022-01-22 22:48:08
  • Java实现文件切割拼接的实现代码

    2022-04-15 08:10:03
  • 简单实现Android绘图板

    2021-09-11 06:36:23
  • 一篇文章轻松搞懂Java中的自旋锁

    2023-06-29 00:00:36
  • AJAX SpringBoot 前后端数据交互的项目实现

    2023-11-24 05:49:48
  • 学习C#静态函数及变量的一个精典例子与代码

    2021-10-08 18:53:52
  • Mybatis RowBounds 限制查询条数的实现代码

    2022-11-18 17:26:03
  • Android Apt之Activity Route的示例

    2022-03-31 17:05:18
  • 花样使用Handler与源码分析

    2023-07-30 08:36:31
  • asp之家 软件编程 m.aspxhome.com