SpringBoot integrado Elasticsearch8.x (6) | (utilizado por la nueva versión Java API Client)

SpringBoot integrado Elasticsearch8.x (6) | (utilizado por la nueva versión Java API Client)


Capítulo
Capítulo
Enlace al Capítulo 1: Integración de SpringBoot con Elasticsearch7.x (1) | (Creación, eliminación, modificación y verificación de la implementación de funciones)
Enlace al Capítulo 2: Integración de SpringBoot a Elasticsearch7.x (2) |
Enlace al Capítulo 3: Integración de SpringBoot a Elasticsearch7.x(3)|(consulta de agregación de índice de agregaciones)
Enlace del capítulo 4: SpringBoot Integrated Elasticsearch7 . , match, match_phrase difference) Enlace del capítulo 6: SpringBoot Integrated Elasticsearch8.x (6) | (nueva versión del cliente API de Java utilizado) Enlace del capítulo 7: SpringBoot integrado Elasticsearch8.x (7) | (nueva versión de Java API Client utilizada ejemplo completo)


prefacio

El cliente java utilizado por ElasticSearch antes de la versión 7.17 es Java REST Client, pero a partir de la versión 7.17, el Java REST Client oficial se marca como obsoleto (obsoleto) y se recomienda una nueva versión de Java Client. Este artículo presenta el uso básico de la nueva versión de ElasticSearch Java Client

1. Introducción a la versión del cliente de ElasticSearch

1. El cliente JAVA REST ES proporciona dos versiones de cliente REST (utilizadas después de la versión 7.17)

Cliente REST de bajo nivel de Java: el cliente oficial de bajo nivel para Elasticsearch. Permite comunicarse con el clúster de Elasticsearch a través de http. Deje la ordenación de la solicitud y la ordenación de la respuesta al usuario. Es compatible con todas las versiones de Elasticsearch.
Ava High Level REST Client: El cliente oficial de alto nivel para Elasticsearch. Se basa en un cliente de bajo nivel, que proporciona muchas API y es responsable de ordenar las solicitudes y desarmar las respuestas. (PD: es como, uno es pasar la cadena que ha unido y analizar el resultado devuelto usted mismo; mientras que el otro es pasar el objeto, el resultado devuelto también ha sido encapsulado, es directamente el objeto, y el el nombre del parámetro está más estandarizado y el formato, que está un poco más orientado a objetos)

2、Cliente TransportClient

El uso de la interfaz de transporte para la comunicación puede utilizar algunas funciones en el clúster ES y el rendimiento es el mejor. La versión del paquete JAR debe ser coherente con la versión del clúster ES. Cuando se actualiza el clúster ES, el cliente también se actualiza a la misma versión.

3. Cliente Java de ElasticSearch (recomendado para la versión 8.x)

El cliente API de Java consta de tres partes: la clase correspondiente del cliente Java es ElasticsearchClient, se usa un mapeador de objetos JSON para la serialización y deserialización de datos, la comunicación de transporte subyacente, y también proporciona llamadas sincrónicas y asincrónicas, transmisión y llamadas funcionales, sin problemas. integrado con Jackson, encapsula el grupo de conexiones, el reintento, la serialización json y otras capacidades generales

2. Introducción y configuración de dependencias

1. Dependencias del cliente de Elasticsearch y dependencias de jackson

La dependencia de jackson generalmente existe en el proyecto springboot y no es necesaria. Elasticsearch8.x se usa oficialmente en springbott3.x. En cuanto a si la versión inferior es factible, debe verificarse.

  <dependency>
  <groupId>co.elastic.clients</groupId>
  <artifactId>elasticsearch-java</artifactId>
  <version>8.5.3</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.12.3</version>
</dependency>

2. Configuración de conexión de cliente y servicio es

Aquí inicializamos tres tipos de cliente
1, cliente 2 de bajo nivel
y transporte de comunicación, y usamos JacksonJsonpMapper para analizar datos.
3. Bloqueo del cliente Java

RestClient restClient = RestClient.builder(
    new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(
    restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);

3. Operación de índice

1. Determinar si el índice existe

El código de implementación es el siguiente

   
    /**
     * 判断索引是否存在
     *
     * @param indexName
     * @return
     * @throws IOException
     */
    public boolean hasIndex(String indexName) throws IOException {
    
    
        BooleanResponse exists = client.indices().exists(d -> d.index(indexName));
        return exists.value();
    }

2. Eliminar el índice

El código de implementación es el siguiente

   
      /**
     * 删除索引
     *
     * @param indexName
     * @throws IOException
     */
    public boolean deleteIndex(String indexName) throws IOException {
    
    
        DeleteIndexResponse response = client.indices().delete(d -> d.index(indexName));
        return true;
    }

3. Crea un índice

El código de implementación es el siguiente

     /**
     * 创建索引,不允许外部直接调用
     *
     * @param indexName
     * @param mapping
     * @throws IOException
     */
    private boolean createIndex(String indexName, Map<String, Property> mapping) throws IOException {
    
    
        CreateIndexResponse createIndexResponse = client.indices().create(c -> {
    
    
            c.index(indexName).mappings(mappings -> mappings.properties(mapping));
            return c;
        });
        return createIndexResponse.acknowledged();
    }
    

mapeo de compilación

    public Map<String, Property> buildMappingV2( Map<String, String> propertyKeys) {
    
    
        Map<String, Property> documentMap = new HashMap<>();
        for (Map.Entry<String, String> propertyKey : propertyKeys.entrySet()) {
    
    
            String type = getIndxPropType(propertyKey.getValue());
            String key = propertyKey.getKey();
            log.info("属性:{}类型:{}", key, type);
            if (type.equals("text")) {
    
    
                documentMap.put(key, Property.of(property ->
                                property.keyword(KeywordProperty.of(p ->
                                                p.index(true)
                                        )
                                )
                        )
                );
            } else if (type.equals("date")) {
    
    
                documentMap.put(key, Property.of(property ->
                                property.date(DateProperty.of(p ->
                                                p.index(true).format("yyyy-MM-dd HH:mm:ss.SSS")
                                        )
                                )
                        )
                );
            } else if (type.equals("long")) {
    
    
                documentMap.put(key, Property.of(property ->
                                property.long_(LongNumberProperty.of(p ->
                                                p.index(true)
                                        )
                                )
                        )
                );
            } else if (type.equals("integer")) {
    
    
                documentMap.put(key, Property.of(property ->
                                property.integer(
                                        IntegerNumberProperty.of(p ->
                                                p.index(false)
                                        )
                                )
                        )
                );
            } else {
    
    
                documentMap.put(key, Property.of(property ->
                                property.object(
                                        ObjectProperty.of(p ->
                                                p.enabled(true)
                                        )
                                )
                        )
                );
            }
        }
        return documentMap;
    }

4. Vuelva a crear el índice

El código de implementación es el siguiente

 /**
     * 重新创建索引,如果已存在先删除
     *
     * @param indexName
     * @param mapping
     */
    public void reCreateIndex(String indexName, Map<String, Property> mapping) {
    
    
        try {
    
    
            if (this.hasIndex(indexName)) {
    
    
                this.deleteIndex(indexName);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
            throw new WrapperException(RetCode.NOT_AVAILABLE, "删除索引失败");
        }

        try {
    
    
            this.createIndex(indexName, mapping);
        } catch (IOException e) {
    
    
            e.printStackTrace();
            throw new WrapperException(RetCode.NOT_AVAILABLE, "重新创建索引失败");
        }
    }
    
# 总结

以上就是SpringBoot集成Elasticsearch数据库内容,在验证过程中遇到很多问题,输出的文档都是经过验证可执行的,后续会慢慢更新文章,尽量覆盖全面,如果大家在使用过程中遇到问题欢迎留言。



Supongo que te gusta

Origin blog.csdn.net/Oaklkm/article/details/128956998
Recomendado
Clasificación