Spring-Boot整合ElasticSearch示例

1、倒入POM依赖
• lombok:lombok工具依赖
• fastjson:用于将JSON转换对象的依赖
• spring-boot-starter-web:SpringBoot的web依赖
• elasticsearch:ElasticSearch依赖,需要和ES版本保持一致
• elasticsearch-rest-high-level-client:用于操作ES的Java客户端

<?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.4.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gxy.es</groupId>
    <artifactId>elastic-boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elastic-boot</name>
    <description>elastic</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>
        <!--elasticsearch-->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.10.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2、ElasticSearch 连接配置
1 . application.yml 配置文件
为了方便更改ES的连接配置,所以说我们将配置信息放置于 application.yml中:

#base
server:
  port: 9527
#spring
spring:
  application:
    name: springboot-elasticsearch

#elasticsearch
elasticsearch:
  schema: http
  address: 127.0.0.1:9200
  connectTimeout: 5000
  socketTimeout: 5000
  connectionRequestTimeout: 5000
  maxConnectNum: 100
  maxConnectPerRoute: 100
  1. java连接配置类
    这里需要写一个 Java 配置类读取 application 中的配置信息
package com.gxy.es.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
 * @author: XiaoYu
 * @create: 2021-01-21 16:16
 * elasticsearch配置
 **/
@Configuration
public class ElasticsearchConfig
{
    /**
     * 协议
     */
    @Value("${elasticsearch.schema:http}")
    private String schema;
    /**
     * 集群地址,如果有多个用","隔开
     */
    @Value("${elasticsearch.address}")
    private String address;
    /**
     * 连接超时时间
     */
    @Value("${elasticsearch.connectTimeout}")
    private int connectTimeout;
    /**
     * socket 连接超时时间
     */
    @Value("${elasticsearch.socketTimeout}")
    private int socketTimeout;
    /**
     * 获取连接的超时时间
     */
    @Value("${elasticsearch.connectionRequestTimeout}")
    private int connectionRequestTimeout;
    /**
     * 最大连接数
     */
    @Value("${elasticsearch.maxConnectNum}")
    private int maxConnectNum;
    /**
     * 最大路由连接数
     */
    @Value("${elasticsearch.maxConnectPerRoute}")
    private int maxConnectPerRoute;
    @Bean
    public RestHighLevelClient restHighLevelClient()
    {
        //拆分地址
        List<HttpHost> httpHosts = new ArrayList<>();
        String[] hostList = address.split(",");
        for (String addr : hostList) {
            String host = addr.split(":")[0];
            String port = addr.split(":")[1];
            httpHosts.add(new HttpHost(host,Integer.parseInt(port),schema));
        }
        //转换成HttpHost数组
        HttpHost[] httpHost = httpHosts.toArray(new HttpHost[]{});
        //构建连接对象
        RestClientBuilder builder = RestClient.builder(httpHost);
        //异步连接延时配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeout)
                    .setSocketTimeout(socketTimeout)
                    .setConnectionRequestTimeout(connectionRequestTimeout);
            return requestConfigBuilder;
        });
        //异步配置连接数配置
        builder.setHttpClientConfigCallback(httpAsyncClientBuilder -> {
            httpAsyncClientBuilder.setMaxConnTotal(maxConnectNum)
                    .setMaxConnPerRoute(maxConnectPerRoute);
            return httpAsyncClientBuilder;
        });
        return new RestHighLevelClient(builder);
    }
}

4、索引示例操作
这里示例会指出通过Kibana的Restful工具操作与对应的java代码操作的两个示例。

  1. Restful操作实例
    创建索引
    创建名为mydlq-user的索引对应的mapping
PUT /mydlq-user
{
  "mappings": {
    "doc": {
      "dynamic": true,
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "address": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "remark": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        },
        "age": {
          "type": "integer"
        },
        "salary": {
          "type": "float"
        },
        "birthDate": {
          "type": "date",
          "format": "yyyy-MM-dd"
        },
        "createTime": {
          "type": "date"
        }
      }
    }
  }
}

删除索引
删除mydlq-user索引

DELETE /mydlq-user

2、java 代码示例

package com.gxy.es.service;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.springframework.stereotype.Service;
import java.io.IOException;
/**
 * @author: XiaoYu
 * @create: 2021-01-21 16:49
 * 代码示例 创建索引
 **/
@Slf4j
@Service
@AllArgsConstructor
public class IndexService2
{
    private final RestHighLevelClient restHighLevelClient;
    /**
     * 创建索引
     */
    public void createIndex()
    {
        try{
            XContentBuilder mapping = XContentFactory.jsonBuilder()
                .startObject()
                    .field("dynamic",true)
                    .startObject("properties")
                        .startObject("name")
                            .field("type","text")
                            .startObject("fields")
                                .startObject("keyword")
                                    .field("type","keyword")
                                .endObject()
                            .endObject()
                        .endObject()
                        .startObject("address")
                            .field("type","text")
                            .startObject("fields")
                                .startObject("keyword")
                                    .field("type","keyword")
                                .endObject()
                            .endObject()
                        .endObject()
                        .startObject("remark")
                            .field("type","text")
                            .startObject("fields")
                                .startObject("keyword")
                                    .field("type","keyword")
                                .endObject()
                            .endObject()
                        .endObject()
                        .startObject("age")
                            .field("type","integer")
                        .endObject()
                        .startObject("salary")
                            .field("type","float")
                        .endObject()
                        .startObject("birthDate")
                            .field("type","date")
                            .field("format","yyyy-MM-dd")
                        .endObject()
                        .startObject("createTime")
                            .field("type","date")
                        .endObject()
                    .endObject()
                .endObject();
            //创建索引配置信息,配置
            Settings setting = Settings.builder()
                    .put("index.number_of_shards",1)
                    .put("index.number_of_replicas",0)
                    .build();
            //新创建索引请求对象,然后设置索引类型(ES 7.0将不催在索引类型)和mapping与index配置
            CreateIndexRequest request = new CreateIndexRequest("mydlq-user");
            request.settings(setting).mapping(mapping);
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
            //判断是否创建成果
            boolean acknowledged = createIndexResponse.isAcknowledged();
            log.info("是否创建成功:{}",acknowledged);
        }catch (IOException e){
            log.error("",e);
        }
    }
    /**
     * 删除索引
     */
    public void deleteIndex()
    {
        try{
            //新建删除索引请求对象
            DeleteIndexRequest request = new DeleteIndexRequest("mydlq-user");
            //执行删除索引
            AcknowledgedResponse acknowledgedResponse = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
            //判断是否删除成功
            boolean acknowledged = acknowledgedResponse.isAcknowledged();
            log.info("是否删除成功: {}",acknowledged);
        }catch (IOException e){
            log.error("",e);
        }
    }
}
posted @ 2021-06-30 15:11  和笙  阅读(352)  评论(0)    收藏  举报