Elasticsearch integration—framework integration SpringData-integration test-index operation

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