Detailed explanation of Springboot integration with Elasticsearch

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

Related function realization

1. Add documents

 2. Modify the document

 3. Query documents by ID

 4. Delete documents by ID

 5. Query all documents

6. Conditional query (single condition)

 7. Conditional query (multiple conditions)

 8. Paging query (descending order)

 9. Paging query (ascending)

 10. Paging query

 11. Range query ( > )

12. Range queries ( >= ) 

 13. Range query ( < )

 14. Range queries ( <= )


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:

Guess you like

Origin blog.csdn.net/sunnyzyq/article/details/121823162
Recommended