Spring Boot與Kotlin 整合全文搜索引擎Elasticsearch的示例代碼
Elasticsearch 在全文搜索里面基本是無(wú)敵的,在大數(shù)據(jù)里面也很有建樹(shù),完全可以當(dāng)nosql(本來(lái)也是nosql)使用。
這篇文章簡(jiǎn)單介紹Spring Boot使用Kotlin語(yǔ)言連接操作 Elasticsearch。但是不會(huì)做很詳細(xì)的介紹,如果要深入了解Elasticsearch在Java/kotlin中的使用,請(qǐng)參考我之前編寫(xiě)的《Elasticsearch Java API 手冊(cè)》 https://gitee.com/quanke/elasticsearch-java/ 里面包含使用實(shí)例,包含我們使用踩過(guò)的坑。
如果完全不了解Elasticsearch請(qǐng)先了解,安裝好Elasticsearch服務(wù)
有多種方式連接Elasticsearch
- Spring Data Elasticsearch
- elasticsearch Java client
- 其他第三方庫(kù)
需要注意的是,如果使用Spring Data Elasticsearch,spring boot 1.5++版本的不支持最新版本的elasticsearch。
下面是spring data elasticsearch 和elasticsearch對(duì)應(yīng)的版本
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 的方式,但是現(xiàn)在官方推薦更好的方式可以參考我寫(xiě)的《Elasticsearch Java Rest API 手冊(cè)》 https://gitee.com/quanke/elasticsearch-java-rest ,但是這篇文章還是使用 elasticsearch Java client
構(gòu)建Spring Boot Kotlin 項(xiàng)目
如果構(gòu)建項(xiàng)目有問(wèn)題的您,可以參考我之前的文章《使用Spring Boot和Kotlin創(chuàng)建RESTfull API》
使用 Gradle 構(gòu)建,在 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的默認(rèn)無(wú)參構(gòu)造函數(shù),默認(rèn)把所有的類設(shè)置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" }
先寫(xiě)測(cè)試基類 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的初始化 * 作為一個(gè)外部訪問(wèn)者,請(qǐng)求ES的集群,對(duì)于集群而言,它是一個(gè)外部因素。 * 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") //設(shè)置ES實(shí)例的名稱 .put("client.transport.sniff", true) //自動(dòng)嗅探整個(gè)集群的狀態(tài),把集群中其他ES節(jié)點(diǎn)的ip添加到本地的客戶端列表中 .build() /** * 這里的連接方式指的是沒(méi)有安裝x-pack插件,如果安裝了x-pack則參考 [ElasticsearchXPackClient] * 1. java客戶端的方式是以tcp協(xié)議在9300端口上進(jìn)行通信 * 2. http客戶端的方式是以http協(xié)議在9200端口上進(jìn)行通信 */ 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)) } } }
運(yùn)行單元測(cè)試
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")//可以是多個(gè)index .setTypes("tweet")//可以是多個(gè)類型 .setQuery(qb) // Query 查詢條件 .get() println(response) } }
我們寫(xiě)了一個(gè) dayu-spring-boot-starter-es ,有機(jī)會(huì)開(kāi)源出來(lái)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud-Alibaba-Sentinel服務(wù)降級(jí),熱點(diǎn)限流,服務(wù)熔斷
這篇文章主要介紹了SpringCloud-Alibaba-Sentinel服務(wù)降級(jí),熱點(diǎn)限流,服務(wù)熔斷,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Java窗體動(dòng)態(tài)加載磁盤(pán)文件的實(shí)現(xiàn)方法
這篇文章主要介紹了Java窗體動(dòng)態(tài)加載磁盤(pán)文件的實(shí)現(xiàn)方法,需要的朋友可以參考下2014-03-03java開(kāi)發(fā)中為什么雙重效驗(yàn)鎖要加volatile
這篇文章主要為大家介紹了java開(kāi)發(fā)中為什么雙重效驗(yàn)鎖要加volatile原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06SpringBoot集成Redis的實(shí)現(xiàn)示例
這篇文章主要介紹了SpringBoot集成Redis的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou
這篇文章主要介紹了專屬于程序員的浪漫-Java輸出動(dòng)態(tài)閃圖iloveyou,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Spring Boot jar可執(zhí)行原理的徹底分析
這篇文章主要給大家介紹了關(guān)于Spring Boot jar可執(zhí)行原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Mybatis中通過(guò)generator生成mapper、Dao、mapper.xml的方法
這篇文章主要介紹了Mybatis中通過(guò)generator生成mapper、Dao、mapper.xml的方法,需要的朋友可以參考下2017-01-01