1.Spring Data Framework introduction
Spring Data
It is a tool used to simplify database, non-relational database, index library access, and supports cloud services.
Open source framework. Its main goal is to make access to data easy and fast, and to support
map-reduce
Frameworks and cloud computing
Computing data services.
Spring Data
can be greatly simplified
JPA
(
Elasticsearch
?) can be written almost without
In the case of writing implementation, access and operate the data. Apart from
CRUD
In addition, it also includes paging, sorting, etc.
Commonly used functions.
Spring Data
Official website:
https://spring.io/projects/spring-data
Commonly used functional modules of Spring Data are as follows:
2.Spring Data Elasticsearch Introduction
Spring Data Elasticsearch
based on
spring data API
Simplify
Elasticsearch
operation, convert the original operation
Elasticsearch
client
API
Encapsulate.
Spring Data
for
Elasticsearch
The project provides an integrated search engine.
Spring Data Elasticsearch POJO
A model centered on key functional areas with
Elastichsearch
Interactive documentation and light
Easily write a storage index library data access layer.
Official website
: https://spring.io/projects/spring-data-elasticsearch
3. Spring Data Elasticsearch Version comparison
Currently, the latest springboot corresponds to Elasticsearch7.6.2, and Spring boot2.3.x is generally compatible with Elasticsearch7.x.
4. Framework integration
1. Create a Maven project
2. Modify the pom file and add dependencies
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.6.RELEASE</version> <relativePath/> </parent> <groupId>com.atguigu.es</groupId> <artifactId>springdata-elasticsearch</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> </dependencies> </project>
3. Add configuration file
exist
resources
Add to directory
application.properties
document
#es service address elasticsearch.host=127.0.0.1 #es service port elasticsearch.port=9200 # Configure log level and enable debug log logging.level.com.atguigu.es=debug
4. SpringBoot main program
package es; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringDataElasticSearchMainApplication { public static void main(String[] args) { SpringApplication.run(SpringDataElasticSearchMainApplication.class,args); } }
5. Data entity class
package es; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Data @NoArgsConstructor @AllArgsConstructor @ToString @Document(indexName = "product", shards = 3, replicas = 1) public class Product { @Id private Long id;//Unique identification of the product @Field(type = FieldType.Text) private String title;//product name @Field(type = FieldType.Keyword) private String category;//category name @Field(type = FieldType.Double) private Double price;//product price @Field(type = FieldType.Keyword, index = false) private String images;//image address }
6. Configuration class
- ElasticsearchRestTemplate is a class in the spring-data-elasticsearch project, similar to templates in other spring projects.
- In the new version of spring-data-elasticsearch, ElasticsearchRestTemplate replaces the original ElasticsearchTemplate.
- The reason is that ElasticsearchTemplate is based on TransportClient, which will be removed in versions 8.x and later. Therefore, we recommend using ElasticsearchRestTemplate.
- ElasticsearchRestTemplate is based on the RestHighLevelClient client. Need to customize configuration class, inherit
- AbstractElasticsearchConfiguration, and implement the elasticsearchClient() abstract method to create a RestHighLevelClient object.
package es; import lombok.Data; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; @ConfigurationProperties(prefix = "elasticsearch") @Configuration @Data public class ElasticsearchConfig extends AbstractElasticsearchConfiguration { private String host; private Integer port; //Override parent class method @Override public RestHighLevelClient elasticsearchClient() { RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)); RestHighLevelClient restHighLevelClient = new RestHighLevelClient(builder); return restHighLevelClient; } }
7. DAO data access object
package es; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Repository; @Repository public interface ProductDao extends ElasticsearchRepository<Product,Long> { }
8. Entity class mapping operation
package es; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.annotations.Document; import org.springframework.data.elasticsearch.annotations.Field; import org.springframework.data.elasticsearch.annotations.FieldType; @Data @NoArgsConstructor @AllArgsConstructor @ToString @Document(indexName = "product", shards = 3, replicas = 1) public class Product { @Id private Long id;//Unique identification of the product @Field(type = FieldType.Text) private String title;//product name @Field(type = FieldType.Keyword) private String category;//category name @Field(type = FieldType.Double) private Double price;//product price @Field(type = FieldType.Keyword, index = false) private String images;//image address }
9. Index operation
package es; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringDataESIndexTest { @Autowired private ElasticsearchRestTemplate elasticsearchRestTemplate; //Create index and add mapping configuration @Test public void createIndex(){ System.out.println("Create index"); } @Test public void deleteIndex(){ //Create index, system initialization will automatically create index boolean flg = elasticsearchRestTemplate.deleteIndex(Product.class); System.out.println("Delete index = " + flg); } }
10. Document operation
package es; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.test.context.junit4.SpringRunner; import java.util.ArrayList; import java.util.List; @RunWith(SpringRunner.class) @SpringBootTest public class SpringDataESProductDaoTest { @Autowired private ProductDao productDao; /** * New */ @Test public void save(){ Product product = new Product(); product.setId(2L); product.setTitle("Huawei 2 mobile phone"); product.setCategory("mobile phone"); product.setPrice(2999.0); product.setImages("http://www.atguigu/hw.jpg"); productDao.save(product); } //Revise @Test public void update(){ Product product = new Product(); product.setId(2L); product.setTitle("Xiaomi 2 mobile phone"); product.setCategory("mobile phone"); product.setPrice(9999.0); product.setImages("http://www.atguigu/xm.jpg"); productDao.save(product); } //Query based on id @Test public void findById(){ Product product = productDao.findById(2L).get(); System.out.println(product); } //Query all @Test public void findAll(){ Iterable<Product> products = productDao.findAll(); for (Product product : products) { System.out.println(product); } } //delete @Test public void delete(){ Product product = new Product(); product.setId(1L); productDao.delete(product); } //Add in batches @Test public void saveAll(){ List<Product> productList = new ArrayList<>(); for (int i = 0; i < 10; i + + ) { Product product = new Product(); product.setId(Long.valueOf(i)); product.setTitle("[" + i + "]Redmi phone"); product.setCategory("mobile phone"); product.setPrice(1999.0 + i); product.setImages("http://www.atguigu/xm.jpg"); productList.add(product); } productDao.saveAll(productList); } //Paging query @Test public void findByPageable(){ //Set the sorting (sorting method, forward or reverse order, sorting id) Sort sort = Sort.by(Sort.Direction.ASC,"id"); int currentPage=0;//Current page, the first page starts from 0, 1 means the second page int pageSize = 5;//How many items to display on each page //Set query paging PageRequest pageRequest = PageRequest.of(currentPage, pageSize,sort); //Paging query Page<Product> productPage = productDao.findAll(pageRequest); for (Product Product : productPage.getContent()) { System.out.println(Product); } } }
11. Document search
package es; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.TermQueryBuilder; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.PageRequest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringDataESSearchTest { @Autowired private ProductDao productDao; /** * term query * search(termQueryBuilder) calls the search method, parameter query builder object */ @Test public void termQuery(){ TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "mobile phone"); Iterable<Product> products = productDao.search(termQueryBuilder); for (Product product : products) { System.out.println(product); } } /** * term query plus paging */ @Test public void termQueryByPage(){ int currentPage= 0; int pageSize = 5; //Set query paging PageRequest pageRequest = PageRequest.of(currentPage, pageSize); TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("category", "mobile phone"); Iterable<Product> products = productDao.search(termQueryBuilder,pageRequest); for (Product product : products) { System.out.println(product); } } }
overall interface