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之后,启动
报错如下:
这是因为我们的项目依赖在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 第二次启动项目
报错如下:
解决方法:
加上配置:
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");
}
}
再次启动,启动成功
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 创建索引
代码如下:
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 启动报错:
解决方法:
(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 索引创建成功
为什么会是5个分片,每个分片对应一个副本呢?
查看@Document源码,发现,默认设置shards为5,replicas为1
2.4.2 数据添加成功
2.4.3 @Id 注解作用测试
在创建文档时,我们给stuId加上注解@Id
@Id //加上@Id 就会帮我们创建一个和文档数据里的id一样的记录id
private Long stuId;
此时,我们不加@Id,再来运行,并且我们也是第二次来运行ESTest 里的代码,也就是第二次运行 esTemplate.index(indexQuery);
index方法:当第一次已经创建索引了,之后再运行该方法,便不会再次创建索引,会增加第二次加的新数据。
可以看出,不加@Id注解,就会自动生成_id;加@Id注解的,会生成和此属性一样的值