1.声明
当前内容用于本人学习和使用SpringDataElasticsearch操作Elasticsearch,主要是一些简单的增删改操作(Elasticsearch的版本为7.4.0)
2.pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<!-- <version>3.2.6.RELEASE</version> -->
</dependency>
3.创建基本的配置类(ElasticsearchConfig)
@Configuration
public class ElasticsearchConfig {
@Bean
TransportClientFactoryBean client() {
TransportClientFactoryBean bean=new TransportClientFactoryBean();
bean.setClusterNodes("192.168.126.130:9300");
return bean;
}
}
1.这里就是一个非常简单的配置类,但是这个是根据报错信息得到的SpringData需要的类,所以我们改写即可,但是需要注意的是当前的端口不是9200而是9300
(本人表示不理解),第一个坑
2.如果出现提示当前的index已存在,则需要删除掉才能重新启用(好像只能重复使用SpringData创建的索引,已存在的Index是会报错的
),这是第二个坑
4.创建实体类
@Document(indexName = "test",type = "person")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@Id
private Integer id;
private String user;
private String title;
private String desc;
}
注意当前的实体类中需要使用@Document并指定index和type,否则会报错的
5.创建Repository和controller层以及入口类
Repository接口
@Repository
public interface PersonRepository extends CrudRepository<Person, Integer>{
}
controller层
/**
*
* @author hy
*
*/
@RestController
public class PersonController {
@Autowired
PersonRepository personRepository;
@RequestMapping("/selectAll")
public Object selectAll() {
Iterable<Person> findAll = personRepository.findAll();
return findAll;
}
@RequestMapping("/selectById/{id}")
public Person selectById(@PathVariable("id") Integer id) {
Optional<Person> findById = personRepository.findById(id);
return findById.get();
}
@RequestMapping("/insert")
public String insert(Person person) {
Person save = personRepository.save(person);
return "添加成功,当前添加后数据的id为:" + save.getId();
}
@RequestMapping("/update")
public String update(Person person) {
Optional<Person> findById = personRepository.findById(person.getId());
Person updatePerson = findById.get();
if (updatePerson != null) {
updatePerson.setDesc(person.getDesc());
updatePerson.setTitle(person.getTitle());
updatePerson.setUser(person.getUser());
personRepository.save(person);
return "当前修改的id为:" + person.getId() + ";成功!";
}
return "当前修改的id为:" + person.getId() + ";不存在!";
}
@RequestMapping("/deleteById/{id}")
public String deleteById(@PathVariable("id") Integer id) {
try {
personRepository.deleteById(id);
return "删除id为:" + id + "的数据成功!";
} catch (Exception e) {
return "当前删除的id为:" + id + "的数据不存在";
}
}
}
启动入口类
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = {"org.Elasticsearch.SpringData.repository"})
@EntityScan(basePackages = {"org.Elasticsearch.SpringData.entity"})
public class SpringDataElasticsearchApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDataElasticsearchApplication.class, args);
}
}
这里需要启动@EnableElasticsearchRepositories和@EntityScan,这是标准的SpringData操作
6.测试
添加操作
查询操作
修改操作
查看修改后的数据
查询所有操作
删除操作
删除后再查询操作
直接报错
7.总结
1.在SpringData中操作Elasticsearch的时候一定要注意,当前的端口一定是9300不是9200
,本人就是犯了这个错误导致一直连接不上
2.配置的时候直接使用TransportClientFactoryBean这个类即可
3.注意实体类的Index不能出现已在Elasticsearch中存在,必须由SpringData创建,否则报错
4.使用SpringData可以简化对Elasticsearch的操作,但是需要注意查询一个不存在的id的时候就会报错
以上纯属个人见解,如有问题请联系本人!