Code ví dụ Java Elasticsearch với Spring Data Jest
(Xem lại: Hướng dẫn Elasticsearch)
Các công nghệ sử dụng:
Khởi tạo Index, Type Elasticsearch
Khi Spring Data kết nối tới Elasticsearch, nếu các Index, Type tương ứng chưa tồn tại thì nó sẽ tự động được tạo mới. Do đó chúng ta chỉ cần khởi động Elasticsearch trước khi chạy project là được.
Code ví dụ
Ở bài này mình sẽ sử dụng thư viện spring-data-jest. Nó sẽ tự động cấu hình các bean liên quan tới Elasticsearch
(Xem lại: Code ví dụ Spring Data Elasticsearch)
Phần thư viện các bạn không cần chọn gì cả.
Cấu trúc Project
Thêm thư viện spring-data-jest
vào file pom.xml
<dependency> <groupId>com.github.vanroy</groupId> <artifactId>spring-boot-starter-data-jest</artifactId> <version>3.1.4.RELEASE</version> </dependency>
File cấu hình Spring Boot
Trong file cấu hình Spring Boot ta chỉ cần khai báo uri kết nối tới server Elasticsearch, nó sẽ tự động cấu hình các thông tin liên quan.
spring: data: jest: uri: "http://localhost:9200"
(Xem lại: Cấu hình Elasticsearch)
File entities
package stackjava.com.sbelasticsearch.entities; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; @Document(indexName = "stackjava", type = "customer") public class Customer { @Id private String id; private String name; private String address; // getter - setter }
- Annotation
@Document
tương tự như annotation@Table
khi làm việc với JPA, nó sẽ thực hiện mapping class với index, type tương ứng, ví dụ ở đây sẽ mapping với typecustomer
của indexstackjava
- Annotation
@Id
đánh dấu khóa chính, nếu bạn không truyền id lúc insert thì nó sẽ tự động tạo id cho bạn.
File Repository
package stackjava.com.sbelasticsearch.repositoy; import java.util.List; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; import stackjava.com.sbelasticsearch.entities.Customer; @Repository public interface CustomerRepository extends ElasticsearchRepository<Customer, String>{ List<Customer> findByName(String name); }
Phần repository sẽ sử dụng Spring Data, ở đây mình thừa kế ElasticsearchRepository
.
ElasticsearchRepository
giống với JpaRepository (database sql) hay MongoRepository (database mongodb) nó cũng định nghĩa sẵn các method như findAll
, findById
, remove
, save
… và cũng hỗ trợ cả Query Creation
File chạy, demo
package stackjava.com.sbelasticsearch; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; import stackjava.com.sbelasticsearch.entities.Customer; import stackjava.com.sbelasticsearch.repositoy.CustomerRepository; @SpringBootApplication public class SbElasticsearchApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(SbElasticsearchApplication.class, args); CustomerRepository customerRepository = context.getBean(CustomerRepository.class); System.out.println("---------- Demo insert ----------------"); Customer customer = new Customer(); customer.setName("sena"); customer.setAddress("ha noi"); customerRepository.save(customer); Customer customer2 = new Customer(); customer2.setId("1"); customer2.setName("kai"); customer2.setAddress("london"); customerRepository.save(customer2); System.out.println("saved!"); System.out.println("---------- Demo findAll ----------------"); customerRepository.findAll().forEach(c -> System.out.println(c)); System.out.println("\n---------- Demo find name = 'sena' ----------------"); customerRepository.findByName("sena").forEach(c -> System.out.println(c)); System.out.println("\n---------- Demo delete id = '1' ----------------"); Customer customerDelete = customerRepository.findById("1").orElse(null); if (customerDelete != null) { customerRepository.delete(customerDelete); } System.out.println("Deleted!"); System.out.println("\n---------- Demo findAll after delete ----------------"); customerRepository.findAll().forEach(c -> System.out.println(c)); } }
Kết quả:
---------- Demo insert ---------------- saved! ---------- Demo findAll ---------------- Customer [id=Staj02UBCV3mCWTnCw3N, name=sena, address=ha noi] Customer [id=1, name=kai, address=london] ---------- Demo find name = 'sena' ---------------- Customer [id=Staj02UBCV3mCWTnCw3N, name=sena, address=ha noi] ---------- Demo delete id = '1' ---------------- Deleted! ---------- Demo findAll after delete ---------------- Customer [id=Staj02UBCV3mCWTnCw3N, name=sena, address=ha noi]
Chạy lệnh curl localhost:9200/stackjava/customer/_search?pretty
để xác nhận lại dữ liệu trong elasticsearch
Okay, Done!
Download code ví dụ trên tại đây.
References: