• springboot整合es客户端操作elasticsearch(二)


    在上章节中整合elasticsearch客户端出现版本问题进行了处理,这章来进行springboot整合得操作

    环境:elaticsearch6.2.1,springboot 2.1.8 客户端版本采用6.6.1

    一 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 https://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.8.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.cxy</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>elasticsearch</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>6.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>6.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-io</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>

    二  启动配置和yml文件

    server:
      port: ${port:8085}
    spring:
      application:
        name: xc-search-service
      elasticsearch:
        hostlist: ${eshostlist:127.0.0.1:9200}
    package com.cxy.elasticsearch.config;
    
    import org.apache.http.HttpHost;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class ElasticsearchConfig {
    
        @Value("${spring.elasticsearch.hostlist}")
        private String hostlist;
    
        @Bean
        public RestHighLevelClient restHighLevelClient(){
            //解析hostlist配置信息
            String[] split = hostlist.split(",");
            //创建HttpHost数组,其中存放es主机和端口的配置信息
            HttpHost[] httpHostArray = new HttpHost[split.length];
            for(int i=0;i<split.length;i++){
                String item = split[i];
                httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
            }
            //创建RestHighLevelClient客户端
            return new RestHighLevelClient(RestClient.builder(httpHostArray));
        }
    
        //项目主要使用RestHighLevelClient,对于低级的客户端暂时不用
        @Bean
        public RestClient restClient(){
            //解析hostlist配置信息
            String[] split = hostlist.split(",");
            //创建HttpHost数组,其中存放es主机和端口的配置信息
            HttpHost[] httpHostArray = new HttpHost[split.length];
            for(int i=0;i<split.length;i++){
                String item = split[i];
                httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
            }
            return RestClient.builder(httpHostArray).build();
        }
    
    }
    package com.cxy.elasticsearch;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.ComponentScan;
    
    @SpringBootApplication
    @ComponentScan(basePackages={"com.cxy.elasticsearch"})//扫描本项目下的所有类
    public class ElasticsearchApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ElasticsearchApplication.class, args);
        }
    
    }

    注:

    @ComponentScan(basePackages={"com.cxy.elasticsearch"})//扫描本项目下的所有类

    是可以不加得,只要目录保持在相关下就可以了

    三 controller文件:

    package com.cxy.elasticsearch.controller;
    
    import org.elasticsearch.action.DocWriteResponse;
    import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
    import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
    import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
    import org.elasticsearch.action.get.GetRequest;
    import org.elasticsearch.action.get.GetResponse;
    import org.elasticsearch.action.index.IndexRequest;
    import org.elasticsearch.action.index.IndexResponse;
    import org.elasticsearch.action.support.master.AcknowledgedResponse;
    import org.elasticsearch.client.IndicesClient;
    import org.elasticsearch.client.RestClient;
    import org.elasticsearch.client.RestHighLevelClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.xcontent.XContentType;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Map;
    
    @RestController
    public class EsController {
        @Autowired
        RestHighLevelClient client;
    
        @Autowired
        RestClient restClient;
        @RequestMapping(value = "/createIndex" ,method = RequestMethod.POST)
        public String createIndex(){
            //创建索引请求对象
            CreateIndexRequest createIndexRequest = new CreateIndexRequest("chenxuyou3");
            // 设置参数
            createIndexRequest.settings(Settings.builder().put("number_of_shards","1").put("number_of_replicas","0"));
            //指定映射
            createIndexRequest.mapping("doc"," {
    " +
                    " 	"properties": {
    " +
                    "            "studymodel":{
    " +
                    "             "type":"keyword"
    " +
                    "           },
    " +
                    "            "name":{
    " +
                    "             "type":"keyword"
    " +
                    "           },
    " +
                    "           "description": {
    " +
                    "              "type": "text",
    " +
                    "              "analyzer":"ik_max_word",
    " +
                    "              "search_analyzer":"ik_smart"
    " +
                    "           },
    " +
                    "           "pic":{
    " +
                    "             "type":"text",
    " +
                    "             "index":false
    " +
                    "           }
    " +
                    " 	}
    " +
                    "}", XContentType.JSON);
            //指定索引操作的客户端
            IndicesClient indices = client.indices();
            //执行创建索引库
            CreateIndexResponse createIndexResponse = null;
            try {
                createIndexResponse = indices.create(createIndexRequest);
            } catch (IOException e) {
                e.printStackTrace();
            }
            boolean acknowledged = createIndexResponse.isAcknowledged();
            //获取返回结果
            System.err.println(acknowledged);
            return "ok";
        }
        @RequestMapping(value = "/deleteIndex",method = RequestMethod.POST)
        public String deleteIndex(){
            DeleteIndexRequest chenxuyou3 = new DeleteIndexRequest("chenxuyou2");
            IndicesClient indices = client.indices();
            AcknowledgedResponse delete =null;
            try {
                delete = indices.delete(chenxuyou3);
            } catch (IOException e) {
                e.printStackTrace();
            }
            boolean acknowledged = delete.isAcknowledged();
            System.err.println(acknowledged);
            return "";
        }
        @RequestMapping(value = "/addDoc",method = RequestMethod.POST)
        public String addDoc(){
    //文档内容
            //准备json数据
            Map<String, Object> jsonMap = new HashMap<>();
            jsonMap.put("name", "spring cloud实战");
            jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。");
            jsonMap.put("studymodel", "201001");
            SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            jsonMap.put("timestamp", dateFormat.format(new Date()));
            jsonMap.put("price", 5.6f);
    
            //创建索引创建对象
            //带有type的方法已经废弃
           // IndexRequest indexRequest = new IndexRequest("chenxuyou3","doc");
            IndexRequest indexRequest = new IndexRequest("chenxuyou3");
            //文档内容
            indexRequest.source(jsonMap);
            //通过client进行http的请求
            IndexResponse indexResponse = null;
            try {
                indexResponse = client.index(indexRequest);
            } catch (IOException e) {
                e.printStackTrace();
            }
            DocWriteResponse.Result result = indexResponse.getResult();
            System.err.println(result);
            return "ok";
        }
        @RequestMapping(value = "/selectDoc",method = RequestMethod.GET)
        public String selectDoc(){
            //查询请求对象
           // GetRequest getRequest = new GetRequest("chenxuyou2","doc","8tyV-m4B7rvW_ZY4LvVU");
            GetRequest getRequest = new GetRequest("chenxuyou3","doc","8tyV-m4B7rvW_ZY4LvVU");
            GetResponse getResponse = null;
            try {
                getResponse = client.get(getRequest);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //得到文档的内容
            Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
            System.out.println(sourceAsMap);
            return "ok" ;
        }
    
    
    }
    注:
       //指定映射
            createIndexRequest.mapping("doc"," {
    " +
                    " 	"properties": {
    " +
                    "            "studymodel":{
    " +
                    "             "type":"keyword"
    " +
                    "           },
    " +
                    "            "name":{
    " +
                    "             "type":"keyword"
    " +
                    "           },
    " +
                    "           "description": {
    " +
                    "              "type": "text",
    " +
                    "              "analyzer":"ik_max_word",
    " +
                    "              "search_analyzer":"ik_smart"
    " +
                    "           },
    " +
                    "           "pic":{
    " +
                    "             "type":"text",
    " +
                    "             "index":false
    " +
                    "           }
    " +
                    " 	}
    " +
                    "}", XContentType.JSON);

    这个就是我们平时在postman中配置得json文件

    例如:

    {
        "properties": {
            "description": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            },
            "name": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_smart"
            },
            "pic": {
                "type": "text",
                "index": false
            },
            "price": {
                "type": "float"
            },
            "studymodel": {
                "type": "keyword"
            },
            "timestamp": {
                "type": "date",
                "format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis"
            }
        }
    }

    然后idea会进行编译下,所以导致阅读起来不是很好

    调用删除aip接口:

    这个错误就是index不存在得意思。所以需要先调用下生成得,再进行删除

     localhost:8085/createIndex

    {
        "timestamp": "2019-12-15T07:10:34.015+0000",
        "status": 500,
        "error": "Internal Server Error",
        "message": "Elasticsearch exception [type=resource_already_exists_exception, reason=index [chenxuyou3/sefNCOu1T8a7CKW463M83g] already exists]",
        "path": "/createIndex"
    }

    可以知道这个是存在得意思,随意修改代码再重新操作:

    调用localhost:8085/addDoc

    {
        "timestamp": "2019-12-15T07:13:38.902+0000",
        "status": 500,
        "error": "Internal Server Error",
        "message": "Validation Failed: 1: type is missing;",
        "path": "/addDoc"
    }

    缺少type,由于在6版本中并没有删除所以需要修改这个部分代码

      //创建索引创建对象
            //带有type的方法已经废弃
            IndexRequest indexRequest = new IndexRequest("chenxuyou3","doc");
           // IndexRequest indexRequest = new IndexRequest("chenxuyou3");
            //文档内容

    如图中,将type重新加入,就不会报错了

    调用查询错误码405.请求方式有问题

     修改方式再调用

    控制台打印null

    但是库里面确实有数据

     id有问题,所以每次插入新数据时候id都不会一样,所以修改id

    {price=5.6, studymodel=201001, name=spring cloud实战, description=本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。, timestamp=2019-12-15 15:15:29}

    控制台打印出来数据。

    所以这边对索引得删除与创建,文档得建立,和数据得查询已经完成。

    下章进行文档得查询,修改,映射得修改查询

  • 相关阅读:
    JSP第三章
    JSP第二章
    JSP第一章
    异常
    七种设计原则
    非泛型集合
    .NET第一章
    航班预定系统
    JSP数据交互(二)
    JSP数据交互(一)
  • 原文地址:https://www.cnblogs.com/cxyxiaobao/p/12044193.html
Copyright © 2020-2023  润新知