content
Integration configuration steps
Step 1: Add Maven related dependencies
Step 2: Configure the host and port of elasticsearch
Step 3: Configure the Elasticsearch client
Step 4: Create Document Entity
Step 5: Create controller, service, dao layers
6. Conditional query (single condition)
7. Conditional query (multiple conditions)
8. Paging query (descending order)
Integration configuration steps
Step 1: Add Maven related dependencies
<!-- 指定 Springboot 版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.7</version>
<relativePath/>
</parent>
<!-- 相关jar包 -->
<dependencies>
<!-- SpringBoot核心jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- web开发包:包含Tomcat和Springmvc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- ES 核心包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- lombok 实体简化插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
Step 2: Configure the host and port of elasticsearch
elasticsearch:
host: 127.0.0.1
port: 9200
Step 3: Configure the Elasticsearch client
@Data
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
private String host;
private Integer port;
@Override
public RestHighLevelClient elasticsearchClient() {
return new RestHighLevelClient(RestClient.builder(new HttpHost(host, port)));
}
}
Step 4: Create Document Entity
@Data
@Document(indexName = "users")
public class User {
@Id
@Field(type = FieldType.Long)
private Long id;
@Field(type = FieldType.Text)
private String name;
@Field(type = FieldType.Keyword)
private String sex;
@Field(type = FieldType.Integer)
private Integer age;
@Field(type = FieldType.Text)
private String address;
}
Step 5: Create controller, service, dao layers
(5.1) contrller layer
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
}
(5.2) service layer
public interface UserService {
}
(5.3) service implementation layer (UserDao see 5.4)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
}
(5.4) dao layers
@Repository
public interface UserDao extends ElasticsearchRepository<User, Long> {
}
After the entire related class is created, the project structure should look like the following:
Related function realization
Here is an example of the actual function, and lists the implementation classes of the controller and service layers as a reference.
For some mainstream functions, ES has already encapsulated them for you, and supports them by default (such as example 1-6). These related implementations do not require us to write the dao layer, but some more business queries need to be done manually. Write.
1. Add documents
controller layer:
@PostMapping("/save")
public String save(@RequestBody User user) {
long id = System.currentTimeMillis();
user.setId(id);
userService.save(user);
return "新增成功,id为:" + id;
}
service layer:
@Override
public Long save(User user) {
userDao.save(user);
return user.getId();
}
Test effect:
2. Modify the document
[Note] For adding and modifying documents, the dao layer calls the save() method. When the id does not exist, ES (ElasticSearch) will perform the new operation. When the id object already exists, it will Perform the modification operation.
controller layer:
@PostMapping("/update")
public String update(@RequestBody User user) {
userService.save(user);
return "修改成功";
}
service layer:
@Override
public Long save(User user) {
userDao.save(user);
return user.getId();
}
Test effect:
3. Query documents by ID
controller layer:
@GetMapping("/{id}")
public User getById(@PathVariable("id") Long id) {
return userService.getById(id);
}
service layer:
@Override
public User getById(Long id) {
Optional<User> find = userDao.findById(id);
if (find.isPresent()) {
return find.get();
}
return null;
}
Test effect:
4. Delete documents by ID
controller layer:
@DeleteMapping("/{id}")
public String deleteById(@PathVariable("id") Long id) {
userService.deleteById(id);
return "删除成功";
}
service layer:
@Override
public void deleteById(Long id) {
userDao.deleteById(id);
}
Test effect:
5. Query all documents
controller layer:
@GetMapping("/all")
public List<User> all() {
return userService.getAll();
}
service layer:
@Override
public List<User> getAll() {
Iterable<User> users = userDao.findAll();
if (users == null) {
return Collections.emptyList();
}
List<User> userList = new ArrayList<User>();
users.forEach(o -> userList.add(o));
return userList;
}
Test effect:
6. Conditional query (single condition)
For example: query data whose name contains "Mary"
controller layer:
@GetMapping("/listByName")
public List<User> listByName(String name) {
return userService.getListByName(name);
}
service layer:
@Override
public List<User> getListByName(String name) {
return userDao.findByName(name);
}
dao layers:
List<User> findByName(String name);
Test effect:
7. Conditional query (multiple conditions)
For example: query the data whose name contains "Mary" and whose age is 25.
controller layer:
@GetMapping("/listByNameAndAge")
public List<User> listByNameAndAge(String name, Integer age) {
return userService.getListByNameAndAge(name, age);
}
service layer:
@Override
public List<User> getListByNameAndAge(String name, Integer age) {
return userDao.findByNameAndAge(name, age);
}
dao layers:
List<User> findByNameAndAge(String name, Integer age);
8. Paging query (descending order)
controller layer:
@GetMapping("/listOrderByAgeDesc")
public List<User> listOrderByAgeDesc() {
return userService.getListOrderByAgeDesc();
}
service layer:
@Override
public List<User> getListOrderByAgeDesc() {
return userDao.findByOrderByAgeDesc();
}
dao layers:
List<User> findByOrderByAgeDesc();
Test effect:
9. Paging query (ascending)
controller layer:
@GetMapping("/listOrderByAgeAsc")
public List<User> listOrderByAgeAsc() {
return userService.getListOrderByAgeAsc();
}
service layer:
@Override
public List<User> getListOrderByAgeAsc() {
return userDao.findByOrderByAgeAsc();
}
dao layers:
List<User> findByOrderByAgeAsc();
Test effect:
10. Paging query
controller layer:
@GetMapping("/page")
public Page<User> page(Integer pageNum, Integer pageSize) {
return userService.getPage(pageNum, pageSize);
}
service layer:
@Override
public Page<User> getPage(int pageNum, int pageSize) {
// 注意,这里的pageNum是从0开始的,如果要查询第1页数据,pageNum应该为0
Pageable pageable = PageRequest.of(pageNum, pageSize);
return userDao.findAll(pageable);
}
Test effect:
11. Range query ( > )
controller layer:
@GetMapping("/listGreaterThanAge")
public List<User> listGreaterThanAge(Integer age) {
return userService.getListGreaterThanAge(age);
}
service layer:
@Override
public List<User> getListGreaterThanAge(Integer age) {
return userDao.findByAgeGreaterThan(age);
}
dao layers:
List<User> findByAgeGreaterThan(Integer age);
Test effect:
12. Range queries ( >= )
controller layer:
@GetMapping("/listGreaterThanEqualAge")
public List<User> listGreaterThanEqualAge(Integer age) {
return userService.getListGreaterThanEqualAge(age);
}
service layer:
@Override
public List<User> getListGreaterThanEqualAge(Integer age) {
return userDao.findByAgeGreaterThanEqual(age);
}
dao layers:
List<User> findByAgeGreaterThanEqual(Integer age);
Test effect:
13. Range query ( < )
controller layer:
@GetMapping("/listLessThanAge")
public List<User> listLessThanAge(Integer age) {
return userService.getListLessThanAge(age);
}
service layer:
@Override
public List<User> getListLessThanAge(Integer age) {
return userDao.findByAgeLessThan(age);
}
dao layers:
List<User> findByAgeLessThan(Integer age);
Test effect:
14. Range queries ( <= )
controller layer:
@GetMapping("/listLessThanEqualAge")
public List<User> listLessThanEqualAge(Integer age) {
return userService.getListLessThanEqualAge(age);
}
service layer:
@Override
public List<User> getListLessThanEqualAge(Integer age) {
return userDao.findByAgeLessThanEqual(age);
}
dao layers:
List<User> findByAgeLessThanEqual(Integer age);
Test effect: