SpringBoot integriert Elasticsearch8.x (6) | (wird vom Java API Client der neuen Version verwendet)

SpringBoot integriert Elasticsearch8.x (6) | (wird vom Java API Client der neuen Version verwendet)


Kapitel
Kapitel
Link zu Kapitel 1: SpringBoot-Integration mit Elasticsearch7.x (1) | (Funktionsimplementierung erstellen, löschen, ändern und prüfen)
Link zu Kapitel 2: SpringBoot-Integration mit Elasticsearch7.x (2) |
Link zu Kapitel 3: SpringBoot-Integration zu Elasticsearch7
. _ _ _ _ Link zu Kapitel 7: SpringBoot integriert Elasticsearch8.x (7) | (Neue Version des Java API Client verwendet vollständiges Beispiel)


Vorwort

Der von ElasticSearch vor Version 7.17 verwendete Java-Client ist der Java-REST-Client. Ab Version 7.17 ist der offizielle Java-REST-Client jedoch als veraltet (veraltet) gekennzeichnet und es wird eine neue Version des Java-Clients empfohlen. In diesem Artikel wird die grundlegende Verwendung der neuen Version des ElasticSearch Java Client vorgestellt

1. Einführung in die ElasticSearch-Clientversion

1. JAVA REST Client ES bietet zwei REST-Client-Versionen (verwendet nach Version 7.17)

Java Low Level REST Client: Der offizielle Low Level Client für Elasticsearch. Es ermöglicht die Kommunikation mit dem Elasticsearch-Cluster über http. Überlassen Sie das Anforderungs-Marshalling und das Antwort-Demarshalling dem Benutzer. Es ist mit allen Elasticsearch-Versionen kompatibel.
ava High Level REST Client: Der offizielle High Level Client für Elasticsearch. Es basiert auf einem Low-Level-Client, der viele APIs bereitstellt und für das Marshalling von Anfragen und das Unmarshalling von Antworten verantwortlich ist. (PS: Das eine besteht darin, die von Ihnen zusammengefügte Zeichenfolge zu übergeben und das zurückgegebene Ergebnis selbst zu analysieren. Das andere besteht darin, das Objekt zu übergeben. Das zurückgegebene Ergebnis wurde ebenfalls gekapselt, es ist direkt das Objekt und das Der Name des Parameters ist standardisierter und das Format ist etwas objektorientierter.)

2、TransportClient-Client

Durch die Verwendung der Transportschnittstelle für die Kommunikation können einige Funktionen im ES-Cluster genutzt werden, und die Leistung ist am besten. Die Version des JAR-Pakets muss mit der Version des ES-Clusters übereinstimmen. Wenn der ES-Cluster aktualisiert wird, wird auch der Client auf dieselbe Version aktualisiert.

3. ElasticSearch Java Client (empfohlen für Version 8.x)

Der Java-API-Client besteht aus drei Teilen: Die entsprechende Klasse des Java-Clients ist ElasticsearchClient, ein JSON-Objekt-Mapper wird für die Datenserialisierung und -deserialisierung, die zugrunde liegende Transportkommunikation, verwendet und bietet außerdem synchrone und asynchrone Aufrufe, Streaming und Funktionsaufrufe nahtlos Integriert in Jackson, kapselt Verbindungspool, Wiederholung, JSON-Serialisierung und andere allgemeine Funktionen

2. Einführung und Konfiguration der Abhängigkeit

1. Elasticsearch-Client-Abhängigkeiten und Jackson-Abhängigkeiten

Die Jackson-Abhängigkeit ist normalerweise im Springboot-Projekt vorhanden und nicht erforderlich. Elasticsearch8.x wird offiziell auf springbott3.x verwendet. Ob die niedrigere Version machbar ist, muss überprüft werden.

  <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. Konfiguration der Client- und ES-Dienstverbindung

Hier initialisieren wir drei Arten von Client
1, Low-Level-Client
2 und Kommunikationstransport und verwenden JacksonJsonpMapper zur Datenanalyse.
3. Blockieren des Java-Clients

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

3. Indexoperation

1. Stellen Sie fest, ob der Index vorhanden ist

Der Implementierungscode lautet wie folgt

   
    /**
     * 判断索引是否存在
     *
     * @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. Löschen Sie den Index

Der Implementierungscode lautet wie folgt

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

3. Erstellen Sie einen Index

Der Implementierungscode lautet wie folgt

     /**
     * 创建索引,不允许外部直接调用
     *
     * @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();
    }
    

Build-Mapping

    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. Erstellen Sie den Index neu

Der Implementierungscode lautet wie folgt

 /**
     * 重新创建索引,如果已存在先删除
     *
     * @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数据库内容,在验证过程中遇到很多问题,输出的文档都是经过验证可执行的,后续会慢慢更新文章,尽量覆盖全面,如果大家在使用过程中遇到问题欢迎留言。



Guess you like

Origin blog.csdn.net/Oaklkm/article/details/128956998