Zoeken…


Invoering

Spring Data Elasticsearch is een Spring Data- implementatie voor Elasticsearch die integratie met de Elasticsearch- zoekmachine biedt.

Spring Boot en Spring Data Elasticsearch-integratie

In dit voorbeeld gaan we het project lente-data-elastische zoeken implementeren om POJO in elastische zoeken op te slaan. We zullen een voorbeeld van een mavenproject zien dat het volgende doet:

  • Voeg een Greeting(id, username, message) op elastischesearch.
  • Ontvang alle begroetingsitems die zijn ingevoegd.
  • Update een begroetingsitem.
  • Een begroetingsitem verwijderen.
  • Ontvang een begroetingsitem op ID.
  • Ontvang alle begroetingsitems op gebruikersnaam.

Spring boot en lente data elastische zoeken integratie

In dit voorbeeld gaan we een op maven gebaseerde spring boot-applicatie zien die lente-data-elastische zoekopdrachten integreert. Hier zullen we het volgende doen en de respectieve codesegmenten zien.

  • Voeg een Greeting(id, username, message) op elastischesearch.
  • Download alle items van elastiekzoeker
  • Update een specifiek item.
  • Verwijder een specifiek item.
  • Krijg een specifiek item op ID.
  • Krijg een specifiek item op gebruikersnaam.

Projectconfiguratiebestand (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>

We zullen Spring Boot van versie 1.5.6.RELEASE en Spring Data Elasticsearch van die respectieve versie gebruiken. Voor dit project moeten we magneticsearch-2.4.5 uitvoeren om onze apis te testen.

Eigenschappen bestand

We zullen het projecteigenschappenbestand (genaamd applications.properties ) in resources map resources die het volgende bevat:

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

We gebruiken de standaard clusternaam, host en poort. Standaard wordt de 9300 poort gebruikt als transportpoort en staat de 9200 poort bekend als http-poort. Om de standaard clusternaam te zien, klik op http: // localhost: 9200 / .

Hoofdklasse (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 is een combinatie van @Configuration met @Configuration , @EnableAutoConfiguration , @EnableWebMvc en @ComponentScan . De methode main() gebruikt de methode SpringApplication.run() Spring Boot om een toepassing te starten. Daar hebben we geen XML-configuratie nodig, deze applicatie is pure Java Spring-applicatie.

Elasticsearch-configuratieklasse (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 configureert ElasticsearchConfig voor dit project en maakt een verbinding met ElasticSearch. Hier wordt @PropertySource gebruikt om het bestand application.properties te lezen waarin we de clusternaam, elastischesearch-host en poort opslaan. @EnableElasticsearchRepositories wordt gebruikt om Elasticsearch-repository's in te schakelen die standaard de pakketten van de geannoteerde configuratieklasse scannen voor Spring Data-repository's. @Value wordt hier gebruikt voor het lezen van de eigenschappen uit het bestand application.properties .

De methode Client() maakt een transportverbinding met elastiekzoeker. De bovenstaande configuratie stelt een Embedded Elasticsearch-server in die wordt gebruikt door de ElasticsearchTemplate . De ElasticsearchTemplate bean gebruikt de Elasticsearch Client en biedt een aangepaste laag voor het manipuleren van gegevens in Elasticsearch.

Modelklasse (Greeting.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 hebben we onze Greeting geannoteerd met een @Document-annotatie die we ook kunnen gebruiken om indexinstellingen te bepalen, zoals naam, aantal scherven of aantal replica's. Een van de kenmerken van de klasse moet een id , door deze te annoteren met @Id of door een van de automatisch gevonden namen id of documentId . Hier wordt de id veldwaarde automatisch gegenereerd als we geen waarde voor het id veld instellen.

Elasticsearch Repository Class (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 hebben we ElasticsearchRepository uitgebreid die ons veel apis biedt die we niet extern hoeven te definiëren. Dit is de basisrepositoryklasse voor op domeinen van het elasticsearch gebaseerde domein. Omdat het Spring gebaseerde repository-klassen uitbreidt, profiteren we van het vermijden van boilerplate-code die nodig is om datatoegangslagen te implementeren voor verschillende persistentieopslag.

Hier hebben we een methode findByUsername(String username) verklaard die wordt geconverteerd naar een findByUsername(String username) die overeenkomt met de gebruikersnaam met het username van Greeting en de lijst met resultaten retourneert.

Services (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);
}

Serviceboon (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 de bovenstaande klasse hebben we @Autowired de GreetingRepository . We kunnen eenvoudig de CRUDRepository methoden en de methode die we in de repository-klasse met het GreetingRepository object hebben opgegeven, aanroepen.

In de methode getAll() , kunt u een regel Lists.newArrayList(repository.findAll()) . We hebben dit gedaan om repository.findAll() te converteren naar het item List<> omdat het een Iterable lijst retourneert.

Controller Class (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);
    }
}

Bouwen

Om deze maven-applicatie uit te voeren

mvn clean install

Boven commando verwijdert u eerst alle bestanden in de target map en het project uit te bouwen. Na het bouwen van het project krijgen we het uitvoerbare .jar-bestand met de naam springdataes-1.0-SNAPSHOT.jar . We kunnen de hoofdklasse ( Application.java ) uitvoeren om het proces te starten of gewoon de bovenstaande pot uitvoeren door te typen:

java -jar springdataes-1.0-SNAPSHOT.jar

Controle van de API's

Voor het invoegen van een begroetingsitem in elastisch zoeken, voert u de onderstaande opdracht uit

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

U zou het onderstaande resultaat als moeten krijgen

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

Je kunt de get api ook controleren door het volgende uit te voeren:

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

Je zou moeten krijgen

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

U kunt andere apis controleren door de bovenstaande processen te volgen.

Officiële documentatie:



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow