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
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 文件中添加
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


猜你喜欢
- 1. List1.1 List 的常见方法方法描述boolean add(E e)尾插 evoid add(int index, E ele
- 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10
- 大多数浏览器会对同一域名的请求限制请求数量,一般是在8个以内。每次最多可以同时请求8个,要是资源多于8个,那么剩下的就要排队等待请求了。所以
- 进程间图怎么传递图形buffer写这篇文章的目的:讲解 进程间图怎么传递图形buffer的最近研究图形缓存怎么在进程之间传递的,谷歌了所有的
- 1、什么是集合框架?在java中,有一套现成的数据结构,例如顺序表,链表,队列,栈,优先级队列,哈希表等,被封装成了相应的接口/类,供程序员
- 本文为大家分享了android实现图片橡皮擦和快速染色的具体代码,供大家参考,具体内容如下源码地址:Eraselmg1.染色 &n
- 这篇文章主要介绍了Java连接Linux服务器过程分析(附代码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 一、先看下项目结构CodeGenerator:生成器主类resources下的mapper.java.vm:一个模板类,用以在生成dao层时
- 本文实例为大家分享了Android Studio实现智能聊天的具体代码,供大家参考,具体内容如下1、布局activit_main.xml&l
- 1. 准备工作首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而
- 原理UI设计的时候一般会按照一个固定的尺寸进行设计,如 360 x 690 ,实际设备分辨率可能是 Google Pixel: 1080 x
- 之前使用OnSharedPreferenceChangeListener,遇到了点小问题,就是有些时候OnSharedPreferenceC
- 本文实例讲述了Java HashMap三种循环遍历方式及其性能对比。分享给大家供大家参考,具体如下:HashMap的三种遍历方式(1)for
- 参数为对象1、提交表单2、表单序列化,使用ajax提交var data = $("#addForm").serializ
- 前言上一篇文章中我们通过自己开发了一个负载均衡组件,实现了随机算法的负载均衡功能,如果要实现其他算法,还需要修改代码增加相应的功能。这一篇文
- 微服务治理Spring Cloud 工具套件为微服务治理提供了全面的技术支持。这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、
- MainActivity如下: package cn.testcallback; import android.os.Bundle; imp
- 目录LinkedHashMap 实现继承 LinkedHashMap组合 LinkedHashMap链表 + HashMap 实现LRU,即
- 在springboot项目中如果要在不集成templates的情况下访问静态资源需要做以下配置1.在项目的application.yml文件
- Socket里面的协议解析是Socket通讯程序设计中最复杂的地方,如果你的应用层协议设计或实现不佳,Socket通讯中常见的粘包,分包就难