Spring BootとKotlinを統合した全文検索エンジンElasticsearchのコード例


Elasticsearchは全文検索では無敵です。ビッグデータの中にもツリーがあります。完全に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はサポートされていません。
    以下はスプリングdata elasticsearchとelasticsearchの対応バージョンです。
    spring data elasticsearch
    elasticsearch
    3..00.RC 2
    5..0
    3..00.M 4
    5.4.0
    2.0.4.RELEASE
    2.4.0
    2.0.RELEASE
    2.2.0
    1.4.0.M 1
    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.0.6で、spring bootは1.5.6で、Elasticsearch 5.0以上のバージョンをサポートしているspring data elasticsearchはまだRELEASEバージョンではありません。私たちが採用しているのはelasticsearch Java clientの方式です。しかし、今はより良い方法を紹介します。私が書いた「Elasticsearch Java Researt APIマニュアル」https://gitee.com/quanke/elasticsearch-java-restを参考にしてもいいです。しかし、この文章はやはりelasticsearch Java clientを使います。
    Spring Boot Kotlinプロジェクトを構築する
    プロジェクトの構築に問題がある場合は、前の記事「Spring BootとKotlinを使ってRESTfull APIを作成する」を参考にしてください。
    Graadleを使って構築し、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"
    }
    
    
    まずテストベースのElasticsearch Cientを書きます。
    
    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を書きました。
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。