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

2018-08-15 10:58:22 浏览数 (1)

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

代码语言:javascript复制
dependencies {
    compile "org.elasticsearch:elasticsearch:$elasticsearch_version"
    compile "org.elasticsearch.client:transport:$elasticsearch_version"
}

完整的 build.gradle文件

代码语言:javascript复制
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

代码语言:javascript复制
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))
        }
    }

}

运行单元测试

代码语言:javascript复制
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

0 人点赞