zoukankan      html  css  js  c++  java
  • kotlin + springboot启用elasticsearch搜索

    参考自:

    http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p=78908

    工具版本: elasticsearch 6.2.2、 kibana 6.2.2,  下载地址: elasticsearchkibana

    下载demo

    1、kotlin版springboot项目创建

    访问https://start.spring.io/, 创建项目demo(maven + kotlin + springboot 2.1.7, 其他默认)。

    添加web支持、elasticsearch搜索及kotlin测试所需依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-test-junit5 -->
            <dependency>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-test-junit5</artifactId>
                <version>1.2.70</version>
                <scope>test</scope>
            </dependency>

    最终pom.xml文件为

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.7.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <kotlin.version>1.2.71</kotlin.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-reflect</artifactId>
            </dependency>
            <dependency>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-stdlib-jdk8</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-test-junit5 -->
            <dependency>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-test-junit5</artifactId>
                <version>1.2.70</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
            <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.jetbrains.kotlin</groupId>
                    <artifactId>kotlin-maven-plugin</artifactId>
                    <configuration>
                        <args>
                            <arg>-Xjsr305=strict</arg>
                        </args>
                        <compilerPlugins>
                            <plugin>spring</plugin>
                        </compilerPlugins>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.jetbrains.kotlin</groupId>
                            <artifactId>kotlin-maven-allopen</artifactId>
                            <version>${kotlin.version}</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    
    </project>
    View Code

    2、创建实体类Category.kt

    package com.example.demo.entity
    
    import org.springframework.data.elasticsearch.annotations.Document
    
    @Document(indexName = "test", type = "category")
    class Category {
        var id : Int? = null;
        var name : String? = null;
    }

    es操作dao类CategoryESDAO.kt

    package com.example.demo.es
    
    import com.example.demo.entity.Category
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository
    
    interface CategoryESDAO : ElasticsearchRepository<Category, Int>

    创建类SearchController.kt,并实现搜索方法,这里根据keyword作为前缀进行搜索

    package com.example.demo.controller
    
    import com.example.demo.entity.Category
    import com.example.demo.es.CategoryESDAO
    import org.elasticsearch.common.lucene.search.function.FunctionScoreQuery
    import org.elasticsearch.index.query.QueryBuilders
    import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders
    import org.springframework.data.domain.PageRequest
    import org.springframework.data.domain.Sort
    import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder
    import org.springframework.stereotype.Controller
    import org.springframework.web.bind.annotation.GetMapping
    import org.springframework.web.bind.annotation.RequestParam
    import org.springframework.web.bind.annotation.RestController
    import javax.annotation.Resource
    
    @RestController
    class SearchController {
    
    
        @Resource
        private lateinit var categoryESDAO: CategoryESDAO
    
        @GetMapping("/search")
        fun search(@RequestParam(value = "keyword") keyword: String, @RequestParam(value = "start", defaultValue = "0") start: Int,
                   @RequestParam(value = "size", defaultValue = "5") size: Int): List<Category> {
            val queryBuilder = QueryBuilders.matchPhrasePrefixQuery("name", keyword)
            val sort = Sort(Sort.Direction.DESC, "id")
            val pageable = PageRequest.of(start, size, sort)
            val searchQuery = NativeSearchQueryBuilder()
                    .withPageable(pageable)
                    .withQuery(queryBuilder).build()
            val page = categoryESDAO.search(searchQuery)
    
            return page.content.filter {category ->  category != null}.toList()
        }
    
    }

    在类DemoApplication.kt中指定包名,

    package com.example.demo
    
    import org.springframework.boot.autoconfigure.SpringBootApplication
    import org.springframework.boot.runApplication
    import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories
    
    @SpringBootApplication
    @EnableElasticsearchRepositories(basePackages = ["com.example.demo.es"])
    class DemoApplication
    
    fun main(args: Array<String>) {
        runApplication<DemoApplication>(*args)
    }

    在resources目录下application.properties中增加elasticsearch的参数

    #ElasticSearch
    spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300

    3、创建测试类

    在test/kotlin目录下com.example.demo包下创建类TestSearchController.kt测试搜索

    package com.example.demo
    
    import com.example.demo.entity.Category
    import com.example.demo.es.CategoryESDAO
    import org.junit.jupiter.api.BeforeAll
    import org.junit.jupiter.api.BeforeEach
    import org.junit.jupiter.api.Test
    import org.junit.jupiter.api.TestInstance
    import org.springframework.boot.test.context.SpringBootTest
    import org.springframework.http.HttpMethod
    import org.springframework.test.context.web.WebAppConfiguration
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers
    import org.springframework.test.web.servlet.setup.MockMvcBuilders
    import org.springframework.web.context.WebApplicationContext
    import javax.annotation.Resource
    
    
    @SpringBootTest
    @WebAppConfiguration
    class TestSearchController {
    
        @Resource
        private lateinit var wac : WebApplicationContext
    
        @Resource
        private lateinit var categoryESDAO: CategoryESDAO
    
        @BeforeEach
        fun add() {
            for (ch in 'a'..'z') {
                val category = Category()
                category.id = ch - 'a'
                category.name = ch.toUpperCase().toString().plus(ch)
                categoryESDAO.save(category)
            }
        }
    
        @Test
        fun test() {
            val mockMvc = MockMvcBuilders.webAppContextSetup(wac).build()
            val result = mockMvc.perform(MockMvcRequestBuilders.request(HttpMethod.GET, "/search?keyword=Aa"))
                    .andExpect(MockMvcResultMatchers.status().isOk)
                    .andDo(::println)
                    .andReturn().response.contentAsString;
            println(result)
        }
    }

    依次启动elasticsearch6.2.2、kibana6.2.2,

    在浏览器中打开http://localhost:5601/app/kibana#/dev_tools/console?_g=()

    执行

    PUT test

    创建test(对应Category类Document注解 indexName)索引,然后执行TestSearchController类进行测试,

    控制台输出结果为:

    [{"id":0,"name":"Aa"}]
  • 相关阅读:
    用Eclipse做J2Me开发的前期配置
    cglib和asm相关的文章
    bcp命令详解
    Oracle/PLSQL AFTER DELETE Trigger
    Mybatis(九)分页插件PageHelper使用
    Mybatis(八)逆向工程
    Mybatis(四)关联映射
    Mybatis(三)返回值四.注解配置
    Mybatis(二)参数(Parameters)传递
    Mybatis(一)实现单表的增删改查
  • 原文地址:https://www.cnblogs.com/wushengwuxi/p/11349523.html
Copyright © 2011-2022 走看看