Code ví dụ Java Elasticsearch với Spring Data Jest

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)

Code ví dụ Java Elasticsearch với Spring Data Jest

Phần thư viện các bạn không cần chọn gì cả.

Code ví dụ Java Elasticsearch với Spring Data Jest

Cấu trúc Project

Code ví dụ Java Elasticsearch với Spring Data Jest

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 type customer của index stackjava
  • 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.

ElasticsearchRepositorygiống với JpaRepository (database sql) hay MongoRepository (database mongodb) nó cũng định nghĩa sẵn các method như findAllfindByIdremovesave… 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

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:

https://github.com/VanRoy/spring-data-jest

stackjava.com