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版本,所有我们采用的是 elasticsearchJavaclient的方式,但是现在官方推荐更好的方式可以参考我写的《Elasticsearch Java Rest API 手册》 https://gitee.com/quanke/elasticsearch-java-rest,但是这篇文章还是使用 elasticsearchJavaclient

构建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 ,有机会开源出来

更多Spring Boot 和 kotlin相关内容

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

我的第一个Kotlin应用

使用Spring Boot和Kotlin创建RESTfull API

Spring Boot 与 kotlin 使用Thymeleaf模板引擎渲染web视图

Spring Boot 与 Kotlin使用Freemarker模板引擎渲染web视图

Spring Boot 与 Kotlin Web应用的统一异常处理

Spring Boot 与 Kotlin 处理Web表单提交

Spring Boot 与 Kotlin 验证web表单信息

Spring Boot 与 Kotlin 上传文件

Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL

Spring Boot 与 Kotlin使用Spring-data-jpa简化数据访问层

Spring Boot 与 Kotlin 使用Redis数据库

Spring Boot 与 Kotlin 使用MongoDB数据库

Spring Boot与Kotlin使用Spring Data Rest创建HAL风格Restful接口

参考

  • https://gitee.com/quanke/elasticsearch-java-rest
  • https://gitee.com/quanke/elasticsearch-java

原文发布于微信公众号 - 全栈架构(keatingr)

原文发表时间:2018-02-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

使用shell脚本查看数据库负载情况(第二篇)(r3笔记第92天)

在之前写了一个shell脚本,能够得到一个基于时间点的数据库负载报告。 使用shell脚本查看数据库负载情况 http://blog.itpub.net/237...

3395
来自专栏前端之路

Hello World

1183
来自专栏颇忒脱的技术博客

Spring、Spring Boot和TestNG测试指南 - 使用Spring Boot Testing工具

前面一个部分讲解了如何使用Spring Testing工具来测试Spring项目,现在我们讲解如何使用Spring Boot Testing工具来测试Sprin...

1503
来自专栏Ken的杂谈

Spring Cloud 入门教程4、服务容错保护:断路器(Hystrix)

在分布式架构中,一个应用依赖多个服务是非常常见的,如果其中一个依赖由于延迟过高发生阻塞,调用该依赖服务的线程就会阻塞,如果相关业务的QPS较高,就可能产生大量阻...

1501
来自专栏about云

让你快速认识flume及安装和使用flume1.5传输数据(日志)到hadoop2.2

问题导读: 1.什么是flume? 2.如何安装flume? 3.flume的配置文件与其它软件有什么不同? 一、认识flume 1.flume是什么? ...

38213
来自专栏乐沙弥的世界

MySQL 5.7 时间显示修改(log_timestamps UTC)

在MySQL 5.7版本中,日志记录时间发生了变化,使用了UTC方式来记录日志时间,也就是说这是个世界统一时间,与我们常用的本地时间不协调,因此,初始化MySQ...

923
来自专栏F_Alex

SpringCloud-声明式Rest调用Feign(四)

2435
来自专栏编程坑太多

springboot (八) 文件上传下载

2213
来自专栏WindCoder

springBoot初探-创建项目

一边学习公司用到的技术,一边重构小程序后端,从而更好的理解公司搭建的框架。此处记录一个用idea+gradle+springboot的基础实现。

671
来自专栏iOS122-移动混合开发研究院

【最新最全】为 iOS 和 Android 的真机和模拟器编译 Luajit 库

编译 Luajit 库,的确是一个挑战。因为官网的教程,在当前版本的 Xcode 和 NDK 环境中,已经不适用了。以前只是编译了适用于真机的 Luajit 库...

1420

扫码关注云+社区

领取腾讯云代金券