spring boot 版本2.0.0
ES版本6.4.3
一、pom.xml引入spring-boot-starter-data-elasticsearch,它的version是跟随spring boot的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
二、application.properties:
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300
spring.data.elasticsearch.repositories.enabled=true
#端口自定义
server.port=8010
cluster-name名称,ES默认的是elasticsearch,如果要自定义,还要修改ES解压目录下的config\elasticsearch.yml,找到cluster.name修改并开放注释:
三、新建文档实体类,这里测试索引名称为es_test,type为user
@Document(indexName = "es_test",type = "user")
public class User {
@Id
private String id;
@Field(type = FieldType.text, analyzer = "ik_smart")
private String name;
@Field(type = FieldType.text, analyzer = "ik_smart")
private String country;
@Field(type = FieldType.text, analyzer = "ik_smart")
private String address;
@Field(type = FieldType.text, analyzer = "ik_max_word")
private String remark;
//getter and setter 省略
}
ES的注解
@Document表明一个类是文档对象
@Id表明为文档的ID,可以在新增文档时指定
@Field表明为文档的字段,type是字段的类型,具体哪几种,点进去FieldType看就可以,analyzer指定分词器。
四、新建UserDao继承ES的CrudRepository<T, ID>,这里T是文档实体类,ID是文档ID的类型。CrudRepository接口有点像jpa封装了很多方法。
public interface UserDao extends CrudRepository<User, String>{
}
五、新建Controller,直接注入UserDao像普通service或者mapper那样调用就可以,这里使用CrudRepository封装好的findById简单测试下
controller代码如下:
@RequestMapping("/es")
@RestController
public class EsController {
@Autowired
private UserDao userDao;
@GetMapping("/findById")
public Optional<User> findById(@RequestParam("id")String id) {
return userDao.findById(id);
}
}
六、启动类加入Repository扫包注解
@EnableElasticsearchRepositories(basePackages="com.fan.elasticsearch.Repository")
@SpringBootApplication
public class ElasticsearchApplication {
public static void main(String[] args) {
SpringApplication.run(ElasticsearchApplication.class, args);
System.out.println("==============ElasticsearchApplication启动成功========================");
}
}
项目启动,postman调用接口成功查询出之前添加的文档:
最后,项目结构图
spring data slasticerarch还支持自定义方法,只要方法命名规则符合就可以,这里试下根据user的address字段模糊查询:
UserDao里添加方法:
Optional<List<User>> findByAddressContaining(String address);
controller里调用:
@GetMapping("/findByAddressContaining")
public Optional<List<User>> findByAddressContaining(@RequestParam("address")String address) {
return userDao.findByAddressContaining(address);
}
先查看下我们索引里的所有数据:
执行查询address里包含“武汉”的再查看调用结果:
自定义方法调用成功。
本篇结束,简单又实用。
参考: