社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Elasticsearch

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

全科 • 6 年前 • 345 次点击  

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

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

如果完全不了解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版本,所有我们采用的是elasticsearch Java client的方式,但是现在官方推荐更好的方式可以参考我写的《Elasticsearch Java Rest API 手册》 gitee.com/quanke/elas…,但是这篇文章还是使用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 ,有机会开源出来

更多Spring Boot 和 kotlin相关内容

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

参考


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/AzLfeNbTPD
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/6333
 
345 次点击