Spring Boot integra Elasticsearch en la práctica

1. Introducción

Tengo que usar Elasticsearch en mi proyecto reciente, así que aprendí brevemente cómo usarlo. Algunas de las funciones avanzadas específicas no se pueden mostrar por el momento y las capacidades son un poco limitadas actualmente, pero algunas necesidades básicas aún pueden deben cumplirse. Así que escribí un artículo para solucionarlo y espero que pueda señalar las deficiencias.

2. Instalar y configurar Elasticsearch

implementación de Docker implementación
normal

3. Integre Spring Boot y Elasticsearch

1. Agregar dependencias y archivos de configuración.

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
spring:
  elasticsearch:
    rest:
      uris: 127.0.0.1:9200 #可配置多个,以逗号间隔举例: ip,ip
      connection-timeout: 1
      read-timeout: 30

2. Crear un modelo de datos de Elasticsearch

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.Date;

/**
 * @BelongsProject: spring-elas
 * @BelongsPackage: com.example.springelas.elas.entity
 * @Author: gepengjun
 * @CreateTime: 2023-09-07  09:16
 * @Description: TODO
 * @Version: 1.0
 */
@Data
@Document(indexName = "book",createIndex = true)
public class Book {
    
    
    @Id
    @Field(type = FieldType.Text)
    private String id;
    @Field(analyzer="ik_max_word")
    private String title;
    @Field(analyzer="ik_max_word")
    private String author;
    @Field(type = FieldType.Double)
    private Double price;
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
    @Field(type = FieldType.Date,format = DateFormat.custom, pattern = "8uuuu-MM-dd'T'HH:mm:ss")
    private Date createTime;
    @Field(type = FieldType.Date,format = DateFormat.time)
    private Date updateTime;
    /**
     * 1. Jackson日期时间序列化问题:
     * Cannot deserialize value of type `java.time.LocalDateTime` from String "2020-06-04 15:07:54": Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text '2020-06-04 15:07:54' could not be parsed at index 10
     * 解决:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     * 2. 日期在ES存为long类型
     * 解决:需要加format = DateFormat.custom
     * 3. java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=5, YearOfEra=2020, MonthOfYear=6},ISO of type java.time.format.Parsed
     * 解决:pattern = "uuuu-MM-dd HH:mm:ss" 即将yyyy改为uuuu,或8uuuu: pattern = "8uuuu-MM-dd HH:mm:ss"
     * 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/migrate-to-java-time.html#java-time-migration-incompatible-date-formats
     */
}

3. Defina la interfaz del almacén de Elasticsearch.

public interface ESBookRepository extends ElasticsearchRepository<Book, String> {
    
    

    List<Book> findByTitleOrAuthor(String title, String author);

    @Highlight(fields = {
    
    
            @HighlightField(name = "title"),
            @HighlightField(name = "author")
    })
    @Query("{\"match\":{\"title\":\"?0\"}}")
    SearchHits<Book> find(String keyword);
}

4. Implementar operaciones de datos de Elasticsearch

@Service
public class ESBookImpl {
    
    
    @Autowired
    ESBookRepository esBookRepository;

    public void insertBook(Book book){
    
    

       Book a= esBookRepository.save(book);
        System.out.println(a);
    }

    public Book queryBook(String keyWord){
    
    
       return esBookRepository.findById(keyWord).get();
    }
}

4. Operaciones básicas de consulta e índice.

1. Insertar y actualizar datos

Insertar descripción de la imagen aquí

2. Eliminar datos e índices

    /**
     * @description: 根据id删除
     * @author: gepengjun
     * @date: 2023/9/7 10:35
     * @param: [keyWord]
     * @return: void
     **/
    public void deleteBook(String keyWord){
    
    
        esBookRepository.deleteById(keyWord);
//        esBookRepository.delete(book);  //可通过实体删除
    }

Primero, obtenga todos los datos de acuerdo con el método findAll proporcionado por Spring,
Insertar descripción de la imagen aquí
luego llame al método de eliminación y elimine de acuerdo con el ID.
Puede ver que los datos con el ID 1 ya no están allí.
Insertar descripción de la imagen aquí

3. Consulta condicional y consulta de paginación.

Definir un método de consulta de paginación en el almacén de Elasticsearch

 Page<Book> findByTitle(String title, Pageable pageable);

Llame a este método en la clase encapsulada empresarial

    public Object pageBook(String author){
    
    
        Pageable pageable= PageRequest.of(0, 3);
       return esBookRepository.findByTitle(author,pageable);
    }

Finalmente, llámelo en control y podrá ver la ejecución.
Insertar descripción de la imagen aquí

4. Consultas de clasificación y agregación.

clasificar

Esta es la clasificación de todas las consultas. Si necesita ordenar según consultas condicionales, puede consultar la página anterior para configurarlo usted mismo.

    public Object findDESCBook(){
    
    
        //设置排序规则,针对某个字段排序
        Sort sort = Sort.by(Sort.Direction.DESC, "price");
        return esBookRepository.findAll(sort);
    }

Ordenar por campo de precio

Insertar descripción de la imagen aquí

Consulta de agregación

Todavía existen algunos defectos menores en esta consulta agregada.


    @Autowired
    private ElasticsearchOperations elasticsearchOperations;
    /**
     * @description: 聚合查询
     * @author: gepengjun
     * @date: 2023/9/7 11:37
     * @param: []
     * @return: java.lang.Object
     **/
    public Object findAggregationBOOK(String title){
    
    
        Pageable pageable= PageRequest.of(0, 3);
        TermsAggregationBuilder builder1 = AggregationBuilders.terms("taxonomy").field("title.keyword");

        //构建查询
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                .addAggregation(builder1)
                .withPageable(pageable)
                .build();

        SearchHits<Book> search = elasticsearchOperations.search(build, Book.class);
        for (SearchHit<Book> bookSearchHit : search) {
    
    
            System.out.println(bookSearchHit.getContent());
        }
        Aggregations aggregations = search.getAggregations();
        Map<String, Aggregation> asMap = aggregations.getAsMap();
        return asMap;
    }

Insertar descripción de la imagen aquí

Escenarios de aplicación

Las consultas agregadas son una característica importante de Elasticsearch que se puede utilizar para extraer información resumida significativa y resultados estadísticos de grandes cantidades de datos. El siguiente es un resumen de varios escenarios de aplicación comunes de consultas agregadas en Elasticsearch:

  1. Análisis de datos y estadísticas: las consultas de agregación pueden realizar estadísticas y análisis de grandes cantidades de datos, como calcular promedios, sumas, valores máximos, valores mínimos, etc. Se puede utilizar para generar informes, gráficos o realizar tareas complejas de análisis de datos.

  2. Estadísticas de grupo: las consultas de agregación nos permiten agrupar datos en función de campos específicos y calcular estadísticas para cada grupo. Por ejemplo, en el comercio electrónico, los datos de ventas se pueden agrupar según categorías de productos para obtener ventas o volumen de ventas para cada categoría.

  3. Agregación anidada: Elasticsearch admite la anidación de múltiples operaciones de agregación para lograr necesidades estadísticas y analíticas más complejas. Al crear múltiples niveles de agregaciones anidadas, puede profundizar en las relaciones entre sus datos y obtener información más detallada.

  4. Análisis de tiempo: las consultas de agregación son muy útiles en el análisis de datos de series de tiempo. Puede agrupar datos según intervalos de tiempo específicos y luego realizar operaciones de análisis estadístico dentro de cada período de tiempo. Por ejemplo, los datos del registro de acceso se pueden analizar a lo largo del tiempo por horas, días, semanas o meses.

  5. Análisis de depósitos: la agregación de depósitos es un método de agregación que divide los datos en diferentes depósitos o intervalos. Las condiciones del depósito se pueden definir mediante rango, coincidencia de términos o secuencias de comandos, y se puede realizar un análisis estadístico en cada depósito.

  6. Recuento de cardinalidad y deduplicación: las consultas de agregación también admiten estadísticas de cardinalidad y recuento de deduplicación. Puede encontrar la cantidad de valores únicos en un campo o contar los valores duplicados en él.

  7. Estadísticas de múltiples campos: Elasticsearch permite estadísticas de múltiples campos en una operación de agregación. Esto es útil para analizar múltiples métricas o dimensiones simultáneamente.

5. Consulta avanzada y búsqueda de texto completo

1. Coincidencia de campos múltiples y consulta difusa

    /**
     * @description: 多字段匹配查询
     * @author: gepengjun
     * @date: 2023/9/7 15:40
     * @param: [field1, field2]
     * @return: java.util.List<com.example.springelas.elas.entity.Book>
     **/
    List<Book> findByAuthorOrPrice(String field1, String field2);

    /**
     * @description: 针对一个字段模糊查询
     * @author: gepengjun
     * @date: 2023/9/7 15:40
     * @param: [pattern]
     * @return: java.util.List<com.example.springelas.elas.entity.Book>
     **/
    List<Book> findByAuthorLike(String pattern);

2. Consulta de rango y consulta de expresión regular.

        /**
         * @description: 查询某一个字段根据正则表达式
         * @author: gepengjun
         * @date: 2023/9/7 15:41
         * @param: [regexPattern]
         * @return: java.util.List<com.example.springelas.elas.entity.Book>
         **/
    List<Book> findByAuthorRegex(String regexPattern);

//具体使用即使直接传入一个正则表达式
List<Book> entityList = esBookRepository.findByAuthorRegex("^abc.*");

3. Búsqueda y resaltado de texto completo

Este es el punto culminante

    @Highlight(fields = {
    
    
            @HighlightField(name = "title"),
            @HighlightField(name = "author")
    })
    @Query("{\"match\":{\"title\":\"?0\"}}")
    SearchHits<Book> find(String keyword);

6. Resumen

El uso de EL es el mismo que el de algunos marcos ORM que utilizamos, por lo que el paquete proporcionado por Spring para interactuar con EL se coloca debajo de los datos.

Supongo que te gusta

Origin blog.csdn.net/pengjun_ge/article/details/132729939
Recomendado
Clasificación