1. 配置文件

1.1 加入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

在这里,我所加的依赖对应的es版本是6.4.3, 所以用es 6.4.3作为学习的版本。(或者,如果用的是其他版本的es,可以改依赖为相对应的版本)

1.2 配置yml文件

当我们用java对接es时,客户端使用的端口号是9300,如果是es集群,可以在cluster-nodes后加ip,用英文逗号隔开

spring:
  data:
    elasticsearch:
      cluster-nodes: 192.168.1.34:9300
      cluster-name: imooc-elasticsearch

1.3 第一次启动项目

mvn install之后,启动

报错如下:

spring boot lettuce 集群配置 springboot配置es集群_ooc

这是因为我们的项目依赖在foodie-dev这个项目下,foodie-dev有database url配置,所以这里也要加上 database 的配置:

spring:
  datasource:                                 # 数据源的相关配置
    type: com.zaxxer.hikari.HikariDataSource # 数据源类型:HikariCP
    driver-class-name: com.mysql.jdbc.Driver # mysql驱动
    url: jdbc:mysql://localhost:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect
    username: root
    password: 123456
  data:
    elasticsearch:
      cluster-nodes: 192.168.1.34:9300
      cluster-name: imooc-elasticsearch

1.4 第二次启动项目

报错如下:

spring boot lettuce 集群配置 springboot配置es集群_spring_02

解决方法:

加上配置:

es.set.netty.runtime.available.processors=false

具体做法是创建类ESConfig 

import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class ESConfig {
    /**
     * 解决netty引起的issue
     */
    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }
}

 再次启动,启动成功

spring boot lettuce 集群配置 springboot配置es集群_ooc_03

 2. 创建索引

2.1 创建实体类

package com.imooc.es.pojo;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

@Document(indexName = "stu",type = "_doc")    //如果是es7.x 就不用写type,es7.x没有type
public class Stu {

    @Id    //加上@Id  就会帮我们创建一个和文档数据里的id一样的记录id
    private Long stuId;

    @Field(store = true)    //store:存储  默认是false    index:倒排索引  默认是true
    private String name;

    @Field(store = true)
    private Integer age;

    public Long getStuId() {
        return stuId;
    }

    public void setStuId(Long stuId) {
        this.stuId = stuId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

2.2 创建索引

spring boot lettuce 集群配置 springboot配置es集群_elasticsearch_04

 代码如下:

package com.test;

import com.imooc.Application;
import com.imooc.es.pojo.Stu;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class ESTest {

    @Autowired
    private ElasticsearchTemplate esTemplate;

    @Test
    public void createIndexStu(){

        Stu stu = new Stu();
        stu.setStuId(1001L);
        stu.setName("bat man");
        stu.setAge(18);

        IndexQuery indexQuery = new IndexQueryBuilder().withObject(stu).build();

        //index:创建索引,并添加数据
        esTemplate.index(indexQuery);
    }
}

2.3 启动报错:

spring boot lettuce 集群配置 springboot配置es集群_spring_05

 解决方法:

(1)添加依赖

<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>

(2)在resource文件夹下添加log4j.properties文件,文件配置内容如下:

log4j.rootLogger=DEBUG,stdout,file
log4j.additivity.org.apache=true

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.threshold=INFO
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p %c{1}:%L - %m%n

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.appender.file.Threshold=INFO
log4j.appender.file.append=true
log4j.appender.file.File=/workspaces/logs/foodie-search/imooc.log

2.4 再次启动,启动正常,索引创建成功,数据添加成功

2.4.1 索引创建成功

spring boot lettuce 集群配置 springboot配置es集群_elasticsearch_06

为什么会是5个分片,每个分片对应一个副本呢?

查看@Document源码,发现,默认设置shards为5,replicas为1

spring boot lettuce 集群配置 springboot配置es集群_ooc_07

 2.4.2 数据添加成功

spring boot lettuce 集群配置 springboot配置es集群_spring_08

 2.4.3 @Id 注解作用测试

在创建文档时,我们给stuId加上注解@Id

  @Id    //加上@Id  就会帮我们创建一个和文档数据里的id一样的记录id
    private Long stuId;

此时,我们不加@Id,再来运行,并且我们也是第二次来运行ESTest 里的代码,也就是第二次运行 esTemplate.index(indexQuery);

index方法:当第一次已经创建索引了,之后再运行该方法,便不会再次创建索引,会增加第二次加的新数据。

spring boot lettuce 集群配置 springboot配置es集群_ooc_09

可以看出,不加@Id注解,就会自动生成_id;加@Id注解的,会生成和此属性一样的值