Inhaltsverzeichnis
1. Einführung
2. Code-Praxis
2.1. Abhängigkeiten importieren
2.2. Umgebungsvariablen konfigurieren
2.3. Erstellen Sie die Konfigurationsklasse von Elasticsearch
2.4. Indexverwaltung
2.5. Das sogenannte Dokument dient zum Hinzufügen von Daten zum Index, um die Datenabfrage zu erleichtern. Weitere Informationen finden Sie unten.
Heim Java javaLernprogramm Wie SpringBoot+Elasticsearch die Datensuche implementiert

Wie SpringBoot+Elasticsearch die Datensuche implementiert

May 12, 2023 pm 09:04 PM
elasticsearch springboot

    1. Einführung

    SpringBoot stellt eine Verbindung zu ElasticSearch her. Es gibt vier gängige Methoden:

    • Methode 1: Verbindung zum ES-Server über den Elastic Transport Client. Die zugrunde liegende Schicht basiert auf dem TCP-Protokoll Transportmodul und Remote-ES-Dienst End-to-End-Kommunikation, die Verwendung ab V7.0 wird jedoch offiziell nicht empfohlen und ab V8.0 offiziell entfernt.

    • Methode 2: Verbindung zum ES-Server über den Elastic Java Low Level Rest Client herstellen. Die zugrunde liegende Schicht kommuniziert mit dem Remote-ES-Server über die Restful-API, die auf dem HTTP-Protokoll basiert. Es wird nur die einfachste und grundlegendste API bereitgestellt. Ähnlich wie im vorherigen Artikel wurde Ihnen die API-Betriebslogik vorgestellt.

    • Methode 3: Stellen Sie eine Verbindung zum es-Server über den Elastic Java High Level Rest Client her. Die unterste Ebene ist basierend auf dem Elastic Java Low Level Rest Client gekapselt und bietet eine erweiterte API sowie die Elastic Transport Client-Schnittstelle und -Parameter. Bleiben Sie konsequent, der offiziell empfohlene es-Client.

    • Methode 4: Stellen Sie über den JestClient-Client eine Verbindung zum es-Server her. Dies ist ein von der Open-Source-Community entwickelter es-Client, der auf dem HTTP-Protokoll basiert. Der Beamte behauptet, dass die Schnittstelle und das Code-Design einfacher und vernünftiger sind Der offiziell von ES bereitgestellte Rest-Client ist einfacher zu verwenden und weist eine gewisse Kompatibilität mit ES-Serverversionen auf, die Aktualisierungsgeschwindigkeit ist jedoch nicht sehr hoch. Die aktuelle ES-Version wurde auf V7.9 veröffentlicht, JestClient unterstützt jedoch nur V1.0 bis V6 .X-Versionen von ES.

    Es gibt noch eine weitere Sache, auf die jeder achten muss, und das ist die Kompatibilität der Versionsnummern!

    Während des Entwicklungsprozesses muss jeder besonders auf die Versionsnummern des Clients und des Servers achten und diese so konsistent wie möglich halten. Beispielsweise lautet die Versionsnummer des Servers 6.8.2 und dann die Version Die Nummer des mit es verbundenen Clients sollte vorzugsweise gleich 6.8.2 sein. Auch wenn sie aus Projektgründen nicht konsistent sein kann, muss die Client-Versionsnummer zwischen 6.0.0 und 6.8.2 liegen und darf die Versionsnummer des Servers nicht überschreiten. Damit der Client den normalen Betrieb aufrechterhalten kann, treten sonst viele unerwartete Probleme auf. Wenn der Client die Version 7.0.4 hat, meldet das Programm zu diesem Zeitpunkt verschiedene Fehler und kann nicht einmal verwendet werden.

    Warum machen Sie das? Der Hauptgrund ist, dass die höhere Version des ES-Servers nicht mit der niedrigeren Version von ES6 kompatibel ist. Sie unterscheidet sich stark von einigen API-Anforderungsparameterstrukturen von ES7, daher sollten die Client- und Server-Versionsnummern so weit wie möglich konsistent gehalten werden.

    Kein Unsinn mehr, gehen wir direkt zum Code!

    2. Code-Praxis

    Die in diesem Artikel verwendete SpringBoot-Versionsnummer ist 2.1.0.RELEASE, die Versionsnummer des Servers ist 6.8.2 und die Client verwendet Die offiziell empfohlene Versionsnummer des Elastic Java High Level Rest Client ist 6.4.2, was bequem mit der SpringBoot-Version kompatibel ist.

    2.1. Abhängigkeiten importieren

    <!--elasticsearch-->
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>6.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>6.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.4.2</version>
    </dependency>
    Nach dem Login kopieren

    2.2. Umgebungsvariablen konfigurieren

    In der globalen Konfigurationsdatei application.properties konfigurieren Sie benutzerdefinierte Elasticsearch-Umgebungsvariablen.

    elasticsearch.scheme=http
    elasticsearch.address=127.0.0.1:9200
    elasticsearch.userName=
    elasticsearch.userPwd=
    elasticsearch.socketTimeout=5000
    elasticsearch.connectTimeout=5000
    elasticsearch.connectionRequestTimeout=5000
    Nach dem Login kopieren

    2.3. Erstellen Sie die Konfigurationsklasse von Elasticsearch

    @Configuration
    public class ElasticsearchConfiguration {
    
        private static final Logger log = LoggerFactory.getLogger(ElasticsearchConfiguration.class);
    
    
        private static final int ADDRESS_LENGTH = 2;
    
        @Value("${elasticsearch.scheme:http}")
        private String scheme;
    
        @Value("${elasticsearch.address}")
        private String address;
    
        @Value("${elasticsearch.userName}")
        private String userName;
    
        @Value("${elasticsearch.userPwd}")
        private String userPwd;
    
        @Value("${elasticsearch.socketTimeout:5000}")
        private Integer socketTimeout;
    
        @Value("${elasticsearch.connectTimeout:5000}")
        private Integer connectTimeout;
    
        @Value("${elasticsearch.connectionRequestTimeout:5000}")
        private Integer connectionRequestTimeout;
    
        /**
         * 初始化客户端
         * @return
         */
        @Bean(name = "restHighLevelClient")
        public RestHighLevelClient restClientBuilder() {
            HttpHost[] hosts = Arrays.stream(address.split(","))
                    .map(this::buildHttpHost)
                    .filter(Objects::nonNull)
                    .toArray(HttpHost[]::new);
            RestClientBuilder restClientBuilder = RestClient.builder(hosts);
            // 异步参数配置
            restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> {
                httpClientBuilder.setDefaultCredentialsProvider(buildCredentialsProvider());
                return httpClientBuilder;
            });
    
            // 异步连接延时配置
            restClientBuilder.setRequestConfigCallback(requestConfigBuilder -> {
                requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
                requestConfigBuilder.setSocketTimeout(socketTimeout);
                requestConfigBuilder.setConnectTimeout(connectTimeout);
                return requestConfigBuilder;
            });
    
            return new RestHighLevelClient(restClientBuilder);
        }
    
    
        /**
         * 根据配置创建HttpHost
         * @param s
         * @return
         */
        private HttpHost buildHttpHost(String s) {
            String[] address = s.split(":");
            if (address.length == ADDRESS_LENGTH) {
                String ip = address[0];
                int port = Integer.parseInt(address[1]);
                return new HttpHost(ip, port, scheme);
            } else {
                return null;
            }
        }
    
        /**
         * 构建认证服务
         * @return
         */
        private CredentialsProvider buildCredentialsProvider(){
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName,
                    userPwd));
            return credentialsProvider;
        }
    }
    Nach dem Login kopieren

    Zu diesem Zeitpunkt ist die Client-Konfiguration abgeschlossen und wird beim Starten des Projekts automatisch in den IOC-Container von Spring eingefügt.

    2.4. Indexverwaltung

    es Das Wichtigste ist die Indexbibliothek. Wie wird sie auf der Clientseite erstellt?

    Index erstellen

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 创建索引(简单模式)
         * @throws IOException
         */
        @Test
        public void createIndex() throws IOException {
            CreateIndexRequest request = new CreateIndexRequest("cs_index");
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    
        /**
         * 创建索引(复杂模式)
         * 可以直接把对应的文档结构也一并初始化
         * @throws IOException
         */
        @Test
        public void createIndexComplete() throws IOException {
            CreateIndexRequest request = new CreateIndexRequest();
            //索引名称
            request.index("cs_index");
            //索引配置
            Settings settings = Settings.builder()
                    .put("index.number_of_shards", 3)
                    .put("index.number_of_replicas", 1)
                    .build();
            request.settings(settings);
    
            //映射结构字段
            Map<String, Object> properties = new HashMap();
            properties.put("id", ImmutableBiMap.of("type", "text"));
            properties.put("name", ImmutableBiMap.of("type", "text"));
            properties.put("sex", ImmutableBiMap.of("type", "text"));
            properties.put("age", ImmutableBiMap.of("type", "long"));
            properties.put("city", ImmutableBiMap.of("type", "text"));
            properties.put("createTime", ImmutableBiMap.of("type", "long"));
            Map<String, Object> mapping = new HashMap<>();
            mapping.put("properties", properties);
            //添加一个默认类型
            System.out.println(JSON.toJSONString(request));
            request.mapping("_doc",mapping);
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    }
    Nach dem Login kopieren

    Index löschen

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 删除索引
         * @throws IOException
         */
        @Test
        public void deleteIndex() throws IOException {
            DeleteIndexRequest request = new DeleteIndexRequest("cs_index1");
            AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    
    }
    Nach dem Login kopieren

    Index abfragen

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 查询索引
         * @throws IOException
         */
        @Test
        public void getIndex() throws IOException {
            // 创建请求
            GetIndexRequest request = new GetIndexRequest();
            request.indices("cs_index");
            // 执行请求,获取响应
            GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    }
    Nach dem Login kopieren

    Abfragen, ob Index vorhanden ist

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 检查索引是否存在
         * @throws IOException
         */
        @Test
        public void exists() throws IOException {
            // 创建请求
            GetIndexRequest request = new GetIndexRequest();
            request.indices("cs_index");
            // 执行请求,获取响应
            boolean response = client.indices().exists(request, RequestOptions.DEFAULT);
            System.out.println(response);
        }
    
    }
    Nach dem Login kopieren

    Alle Indexnamen abfragen

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 查询所有的索引名称
         * @throws IOException
         */
        @Test
        public void getAllIndices() throws IOException {
            GetAliasesRequest request = new GetAliasesRequest();
            GetAliasesResponse response =  client.indices().getAlias(request,RequestOptions.DEFAULT);
            Map<String, Set<AliasMetaData>> map = response.getAliases();
            Set<String> indices = map.keySet();
            for (String key : indices) {
                System.out.println(key);
            }
        }
    
    }
    Nach dem Login kopieren

    Abfrageindex-Zuordnungsfeld

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 查询索引映射字段
         * @throws IOException
         */
        @Test
        public void getMapping() throws IOException {
            GetMappingsRequest request = new GetMappingsRequest();
            request.indices("cs_index");
            request.types("_doc");
            GetMappingsResponse response = client.indices().getMapping(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    
    }
    Nach dem Login kopieren

    Indexzuordnungsfeld hinzufügen

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 添加索引映射字段
         * @throws IOException
         */
        @Test
        public void addMapping() throws IOException {
            PutMappingRequest request = new PutMappingRequest();
            request.indices("cs_index");
            request.type("_doc");
    
            //添加字段
            Map<String, Object> properties = new HashMap();
            properties.put("accountName", ImmutableBiMap.of("type", "keyword"));
            Map<String, Object> mapping = new HashMap<>();
            mapping.put("properties", properties);
            request.source(mapping);
            PutMappingResponse response = client.indices().putMapping(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    
    }
    Nach dem Login kopieren

    2.5. Das sogenannte Dokument dient zum Hinzufügen von Daten zum Index, um die Datenabfrage zu erleichtern. Weitere Informationen finden Sie unten.

    Dokument hinzufügen

    rrree

    Fügen Sie Dokumente stapelweise hinzu

    ublic class UserDocument {
    
        private String id;
        private String name;
        private String sex;
        private Integer age;
        private String city;
        private Date createTime;
    
        //省略get、set...
    }
    Nach dem Login kopieren

    Das obige ist der detaillierte Inhalt vonWie SpringBoot+Elasticsearch die Datensuche implementiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

    Heiße KI -Werkzeuge

    Undresser.AI Undress

    Undresser.AI Undress

    KI-gestützte App zum Erstellen realistischer Aktfotos

    AI Clothes Remover

    AI Clothes Remover

    Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

    Undress AI Tool

    Undress AI Tool

    Ausziehbilder kostenlos

    Clothoff.io

    Clothoff.io

    KI-Kleiderentferner

    AI Hentai Generator

    AI Hentai Generator

    Erstellen Sie kostenlos Ai Hentai.

    Heißer Artikel

    R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Beste grafische Einstellungen
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
    3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25: Wie man alles in Myrise freischaltet
    4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

    Heiße Werkzeuge

    Notepad++7.3.1

    Notepad++7.3.1

    Einfach zu bedienender und kostenloser Code-Editor

    SublimeText3 chinesische Version

    SublimeText3 chinesische Version

    Chinesische Version, sehr einfach zu bedienen

    Senden Sie Studio 13.0.1

    Senden Sie Studio 13.0.1

    Leistungsstarke integrierte PHP-Entwicklungsumgebung

    Dreamweaver CS6

    Dreamweaver CS6

    Visuelle Webentwicklungstools

    SublimeText3 Mac-Version

    SublimeText3 Mac-Version

    Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

    Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Vergleich und Differenzanalyse zwischen SpringBoot und SpringMVC Dec 29, 2023 am 11:02 AM

    SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

    Praktisches Tutorial zur SpringBoot+Dubbo+Nacos-Entwicklung Praktisches Tutorial zur SpringBoot+Dubbo+Nacos-Entwicklung Aug 15, 2023 pm 04:49 PM

    In diesem Artikel wird ein detailliertes Beispiel geschrieben, um über die tatsächliche Entwicklung von Dubbo + Nacos + Spring Boot zu sprechen. In diesem Artikel wird nicht zu viel theoretisches Wissen behandelt, sondern das einfachste Beispiel wird geschrieben, um zu veranschaulichen, wie Dubbo in Nacos integriert werden kann, um schnell eine Entwicklungsumgebung aufzubauen.

    php Elasticsearch: Wie verwende ich dynamisches Mapping, um flexible Suchfunktionen zu erreichen? php Elasticsearch: Wie verwende ich dynamisches Mapping, um flexible Suchfunktionen zu erreichen? Sep 13, 2023 am 10:21 AM

    PHPElasticsearch: Wie nutzt man dynamisches Mapping, um flexible Suchfunktionen zu erreichen? Einleitung: Suchfunktionen sind ein wesentlicher Bestandteil der Entwicklung moderner Anwendungen. Elasticsearch ist eine leistungsstarke Such- und Analysemaschine, die umfassende Funktionalität und flexible Datenmodellierung bietet. In diesem Artikel konzentrieren wir uns auf die Verwendung dynamischer Zuordnungen, um flexible Suchfunktionen zu erreichen. 1. Einführung in die dynamische Zuordnung In Elasticsearch ist die Zuordnung (mapp

    Was sind die Unterschiede zwischen SpringBoot und SpringMVC? Was sind die Unterschiede zwischen SpringBoot und SpringMVC? Dec 29, 2023 am 10:46 AM

    Was ist der Unterschied zwischen SpringBoot und SpringMVC? SpringBoot und SpringMVC sind zwei sehr beliebte Java-Entwicklungsframeworks zum Erstellen von Webanwendungen. Obwohl sie häufig separat verwendet werden, sind die Unterschiede zwischen ihnen offensichtlich. Zunächst einmal kann SpringBoot als Erweiterung oder erweiterte Version des Spring-Frameworks betrachtet werden. Es soll den Initialisierungs- und Konfigurationsprozess von Spring-Anwendungen vereinfachen und Entwicklern helfen

    Eingehende Untersuchung der Elasticsearch-Abfragesyntax und praktischer Kampf Eingehende Untersuchung der Elasticsearch-Abfragesyntax und praktischer Kampf Oct 03, 2023 am 08:42 AM

    Eingehende Untersuchung der Elasticsearch-Abfragesyntax und praktische Einführung: Elasticsearch ist eine auf Lucene basierende Open-Source-Suchmaschine. Sie wird hauptsächlich für die verteilte Suche und Analyse verwendet. Sie wird häufig bei der Volltextsuche großer Datenmengen und bei der Protokollanalyse verwendet , Empfehlungssysteme und andere Szenarien. Bei der Verwendung von Elasticsearch für Datenabfragen ist die flexible Verwendung der Abfragesyntax der Schlüssel zur Verbesserung der Abfrageeffizienz. Dieser Artikel befasst sich mit der Elasticsearch-Abfragesyntax und stellt sie anhand tatsächlicher Fälle dar.

    So verwenden Sie PHP und Elasticsearch, um Suchergebnisse hervorzuheben So verwenden Sie PHP und Elasticsearch, um Suchergebnisse hervorzuheben Jul 17, 2023 pm 09:24 PM

    So verwenden Sie PHP und Elasticsearch, um hervorgehobene Suchergebnisse zu erzielen. Einführung: In der modernen Internetwelt sind Suchmaschinen zum wichtigsten Weg für Menschen geworden, Informationen zu erhalten. Um die Lesbarkeit und Benutzererfahrung von Suchergebnissen zu verbessern, ist die Hervorhebung von Suchbegriffen zu einer häufigen Anforderung geworden. In diesem Artikel wird erläutert, wie Sie mithilfe von PHP und Elasticsearch hervorgehobene Suchergebnisse erzielen. 1. Vorbereitung Bevor wir beginnen, müssen wir sicherstellen, dass PHP und Elasticsearch korrekt installiert und konfiguriert wurden.

    Protokollanalyse und Ausnahmeüberwachung basierend auf Elasticsearch in PHP Protokollanalyse und Ausnahmeüberwachung basierend auf Elasticsearch in PHP Oct 03, 2023 am 10:03 AM

    Zusammenfassung der Protokollanalyse und Ausnahmeüberwachung basierend auf Elasticsearch in PHP: In diesem Artikel wird erläutert, wie Sie die Elasticsearch-Datenbank für die Protokollanalyse und Ausnahmeüberwachung verwenden. Anhand prägnanter PHP-Codebeispiele wird gezeigt, wie Sie eine Verbindung zur Elasticsearch-Datenbank herstellen, Protokolldaten in die Datenbank schreiben und die leistungsstarke Abfragefunktion von Elasticsearch verwenden, um Anomalien in den Protokollen zu analysieren und zu überwachen. Einführung: Protokollanalyse und Ausnahmeüberwachung sind

    Was sind die Unterschiede zwischen Spring und Springboot? Was sind die Unterschiede zwischen Spring und Springboot? Dec 29, 2023 pm 05:48 PM

    Der Unterschied zwischen Spring und Springboot: 1. Konfiguration 3. Abhängigkeitsmanagement 6. Integration und Skalierbarkeit; Ausführliche Einführung: 1. Designziele: Spring ist ein umfassendes Framework, das eine Vielzahl von Funktionen für alle Aspekte der Unternehmensanwendungsentwicklung bietet, einschließlich Abhängigkeitsinjektion, Transaktionsverwaltung, Sicherheit usw. 2. Konfiguration, Spring Eine große Menge Zur Erledigung verschiedener Aufgaben ist eine XML- oder Java-Konfiguration erforderlich, was zweifellos die Entwicklungszeit usw. verlängert.

    See all articles