Suche…


Einführung

Spring Data Elasticsearch ist eine Spring Data- Implementierung für Elasticsearch, die die Integration mit der Elasticsearch- Suchmaschine ermöglicht.

Integration von Spring Boot und Spring Data Elasticsearch

In diesem Beispiel werden wir ein Feder-Daten-Elasticsearch-Projekt implementieren, um POJO in der Elasticsearch zu speichern. Wir werden ein Musterprojekt sehen, das folgende Aufgaben erfüllt:

  • Fügen Sie ein Greeting(id, username, message) in elasticsearch ein.
  • Alle Begrüßungselemente abrufen, die eingefügt wurden.
  • Aktualisieren Sie ein Grußelement.
  • Löschen Sie ein Begrüßungselement.
  • Bekommen Sie einen Begrüßungsartikel nach ID.
  • Holen Sie sich alle Begrüßungsartikel nach Benutzername.

Spring Boot und Spring Data Elasticsearch Integration

In diesem Beispiel sehen wir eine Maven-basierte Federstiefelanwendung, die die Federdaten-Elasticsuche integriert. Hier werden wir Folgendes tun und die entsprechenden Codesegmente sehen.

  • Fügen Sie ein Greeting(id, username, message) in elasticsearch ein.
  • Holen Sie sich alle Artikel von elasticsearch
  • Aktualisieren Sie ein bestimmtes Element.
  • Einen bestimmten Artikel löschen
  • Holen Sie sich einen bestimmten Artikel nach ID.
  • Holen Sie sich einen bestimmten Artikel nach Benutzername.

Projektkonfigurationsdatei (pom.xml)

<?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>

    <groupId>org.springdataes</groupId>
    <artifactId>springdataes</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

Wir werden Spring Boot der Version 1.5.6.RELEASE und Spring Data Elasticsearch der jeweiligen Version verwenden. Für dieses Projekt müssen wir elasticsearch-2.4.5 ausführen, um unsere Apis zu testen.

Eigenschaftendatei

Wir legen die Projekteigenschaftsdatei (namens applications.properties ) im resources Folgendes enthält:

elasticsearch.clustername = elasticsearch
elasticsearch.host = localhost
elasticsearch.port = 9300

Wir verwenden den Standard-Clusternamen, Host und Port. Standardmäßig wird der 9300 Port als Transportport verwendet und der 9200 Port wird als http-Port bezeichnet. Um den Standard-Clusternamen anzuzeigen, klicken Sie auf http: // localhost: 9200 / .

Hauptklasse (Application.java)

package org.springdataes;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String []args) {
        SpringApplication.run(Application.class, args);
    }
}

@SpringBootApplication ist eine Kombination aus @Configuration @EnableAutoConfiguration , @EnableWebMvc @Configuration , @EnableAutoConfiguration @EnableWebMvc und @ComponentScan Anmerkungen. Die main() -Methode verwendet die SpringApplication.run() -Methode von Spring Boot, um eine Anwendung zu starten. Da wir keine XML-Konfiguration benötigen, handelt es sich bei dieser Anwendung um eine reine Java-Frühling-Anwendung.

Elasticsearch-Konfigurationsklasse (ElasticsearchConfig.java)

package org.springdataes.config;

import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;

import java.net.InetAddress;

@Configuration
@PropertySource(value = "classpath:applications.properties")
@EnableElasticsearchRepositories(basePackages = "org.springdataes.dao")
public class ElasticsearchConfig {
    @Value("${elasticsearch.host}")
    private String EsHost;

    @Value("${elasticsearch.port}")
    private int EsPort;

    @Value("${elasticsearch.clustername}")
    private String EsClusterName;

    @Bean
    public Client client() throws Exception {
        Settings esSettings = Settings.settingsBuilder()
                .put("cluster.name", EsClusterName)
                .build();

        return TransportClient.builder()
                .settings(esSettings)
                .build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsHost), EsPort));
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws Exception {
        return new ElasticsearchTemplate(client());
    }
}

ElasticsearchConfig Klasse ElasticsearchConfig konfiguriert die ElasticsearchConfig für dieses Projekt und stellt eine Verbindung mit der ElasticsearchConfig . Hier wird @PropertySource zum Lesen der Datei application.properties verwendet, in der der Clustername, der Elasticsearch-Host und der Port gespeichert werden. @EnableElasticsearchRepositories wird verwendet, um Elasticsearch-Repositorys zu aktivieren, die die Pakete der annotierten Konfigurationsklasse standardmäßig nach Spring Data-Repositorys scannen. @Value wird hier zum Lesen der Eigenschaften aus der Datei application.properties verwendet.

Die Client() Methode erstellt eine Transportverbindung mit Elasticsearch. Die obige Konfiguration richtet einen Embedded Elasticsearch Server ein, der vom ElasticsearchTemplate . Die Bean " ElasticsearchTemplate verwendet den Elasticsearch Client und stellt eine benutzerdefinierte Ebene zum Bearbeiten von Daten in Elasticsearch bereit.

Modellklasse (Gruß.java)

package org.springdataes.model;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;

@Document(indexName = "index", type = "greetings")
public class Greeting implements Serializable{

    @Id
    private String id;

    private String username;

    private String message;

    public Greeting() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Hier haben wir unsere Greeting mit einer @Document-Annotation versehen, mit der wir auch Indexeinstellungen wie Name, Anzahl der Shards oder Anzahl der Repliken ermitteln können. Eines der Attribute der Klasse muss eine id , entweder durch Annotation mit @Id oder durch Verwendung eines der automatisch gefundenen Namen id oder documentId . Hier wird der id -Feldwert automatisch generiert, wenn wir keinen Wert für das id Feld festlegen.

Elasticsearch-Repository-Klasse (GreetingRepository.class)

package org.springdataes.dao;

import org.springdataes.model.Greeting;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;

public interface GreetingRepository extends ElasticsearchRepository<Greeting, String> {
    List<Greeting> findByUsername(String username);
}

Hier haben wir das ElasticsearchRepository erweitert, das uns viele Apis bietet, die wir nicht extern definieren müssen. Dies ist die Basis-Repository-Klasse für elasticsearch basierte Domänenklassen. Da Spring basierte Repository-Klassen erweitert werden, haben wir den Vorteil, dass der für die Implementierung von Datenzugriffsschichten für verschiedene Persistenzspeicher erforderliche Boilerplate-Code vermieden wird.

Hier haben wir eine Methode findByUsername(String username) deklariert, die in eine Übereinstimmungsabfrage konvertiert wird, die mit dem Benutzernamen mit dem username der Greeting übereinstimmt und die Ergebnisliste zurückgibt.

Dienste (GreetingService.java)

package org.springdataes.service;

import org.springdataes.model.Greeting;
import java.util.List;

public interface GreetingService {
    List<Greeting> getAll();
    Greeting findOne(String id);
    Greeting create(Greeting greeting);
    Greeting update(Greeting greeting);
    List<Greeting> getGreetingByUsername(String username);
    void delete(String id);
}

Service Bean (GreetingServiceBean.java)

package org.springdataes.service;

import com.google.common.collect.Lists;
import org.springdataes.dao.GreetingRepository;
import org.springdataes.model.Greeting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GreetingServiceBean implements GreetingService {

    @Autowired
    private GreetingRepository repository;

    @Override
    public List<Greeting> getAll() {
        return Lists.newArrayList(repository.findAll());
    }

    @Override
    public Greeting findOne(String id) {
        return repository.findOne(id);
    }

    @Override
    public Greeting create(Greeting greeting) {
        return repository.save(greeting);
    }

    @Override
    public Greeting update(Greeting greeting) {
        Greeting persitedGreeting = repository.findOne(greeting.getId());
        if(persitedGreeting == null) {
            return null;
        }
        return repository.save(greeting);
    }

    @Override
    public List<Greeting> getGreetingByUsername(String username) {
        return repository.findByUsername(username);
    }

    @Override
    public void delete(String id) {
        repository.delete(id);
    }
}

In oben Klasse haben wir @Autowired die GreetingRepository . Wir können einfach die CRUDRepository Methoden und die von uns in der Repository-Klasse mit dem GreetingRepository Objekt deklarierte Methode aufrufen.

In der getAll() -Methode finden Sie möglicherweise eine Zeile Lists.newArrayList(repository.findAll()) . Wir haben dies getan, um repository.findAll() in List<> Iterable zu konvertieren, da es eine Iterable List Iterable .

Controller-Klasse (GreetingController.java)

package org.springdataes.controller;

import org.springdataes.model.Greeting;
import org.springdataes.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api")
public class GreetingController {

    @Autowired
    private GreetingService greetingService;

    @ResponseBody
    @RequestMapping(value = "/greetings", method = RequestMethod.GET)
    public ResponseEntity<List<Greeting>> getAll() {
        return new ResponseEntity<List<Greeting>>(greetingService.getAll(), HttpStatus.OK);
    }

    @ResponseBody
    @RequestMapping(value = "/greetings", method = RequestMethod.POST)
    public ResponseEntity<Greeting> insertGreeting(@RequestBody Greeting greeting) {
        return new ResponseEntity<Greeting>(greetingService.create(greeting), HttpStatus.CREATED);
    }

    @ResponseBody
    @RequestMapping(value = "/greetings", method = RequestMethod.PUT)
    public ResponseEntity<Greeting> updateGreeting(@RequestBody Greeting greeting) {
        return new ResponseEntity<Greeting>(greetingService.update(greeting), HttpStatus.MOVED_PERMANENTLY);
    }

    @ResponseBody
    @RequestMapping(value = "/greetings/{id}", method = RequestMethod.DELETE)
    public ResponseEntity<Greeting> deleteGreeting(@PathVariable("id") String idd) {
        greetingService.delete(idd);
        return new ResponseEntity<Greeting>(HttpStatus.NO_CONTENT);
    }

    @ResponseBody
    @RequestMapping(value = "/greetings{id}", method = RequestMethod.POST)
    public ResponseEntity<Greeting> getOne(@PathVariable("id") String idd) {
        return new ResponseEntity<Greeting>(greetingService.findOne(idd), HttpStatus.OK);
    }

    @ResponseBody
    @RequestMapping(value = "/greetings/{name}", method = RequestMethod.GET)
    public ResponseEntity<List<Greeting>> getByUserName(@PathVariable("name") String name) {
        return new ResponseEntity<List<Greeting>>(greetingService.getGreetingByUsername(name), HttpStatus.OK);
    }
}

Bauen

So erstellen Sie diese Maven-Anwendung

mvn clean install

Obiger Befehl entfernen Sie zuerst alle Dateien im target und das Projekt. Nach dem springdataes-1.0-SNAPSHOT.jar des Projekts erhalten Sie die ausführbare .jar-Datei mit dem Namen springdataes-1.0-SNAPSHOT.jar . Wir können die Hauptklasse ( Application.java ) ausführen, um den Prozess zu starten, oder indem Sie einfach den obigen Jar ausführen, indem Sie Folgendes eingeben:

java -jar springdataes-1.0-SNAPSHOT.jar

Überprüfen der APIs

Führen Sie den folgenden Befehl aus, um ein Begrüßungselement in die Elasticsearch einzufügen

curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is a message"}' http://localhost:8080/api/greetings

Sie sollten das untenstehende Ergebnis gerne erhalten

{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}

Sie können die Get-API auch überprüfen, indem Sie Folgendes ausführen:

curl -H "Content-Type: application/json" -X GET http://localhost:8080/api/greetings

Du solltest bekommen

[{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}]

Sie können andere Apis überprüfen, indem Sie die obigen Schritte befolgen.

Offizielle Dokumentationen:



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow