Sök…


Introduktion

Spring Data Elasticsearch är en Spring Data- implementering för Elasticsearch som ger integration med sökmotorn Elasticsearch .

Spring Boot och Spring Data Elasticsearch integration

I det här exemplet kommer vi att implementera vårdata-elasticsearch-projekt för att lagra POJO i elasticsearch. Vi kommer att se ett exempel på maven-projekt som gör följande:

  • Infoga en Greeting(id, username, message) på elasticsearch.
  • Hämta alla hälsningsprodukter som har lagts in.
  • Uppdatera en hälsningsartikel.
  • Radera en hälsningspost.
  • Skaffa en hälsning av id.
  • Få alla hälsningsartiklar med användarnamn.

Spring boot och vårdata elasticsearch integration

I det här exemplet kommer vi att se en mavenbaserad spring boot-applikation som integrerar vårdata-elasticsearch. Här kommer vi att göra följande och se respektive kodesegment.

  • Infoga en Greeting(id, username, message) på elasticsearch.
  • Hämta alla artiklar från elasticsearch
  • Uppdatera en specifik artikel.
  • Radera en specifik artikel.
  • Skaffa en specifik artikel efter id.
  • Skaffa ett specifikt objekt med användarnamn.

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

Vi kommer att använda Spring Boot av version 1.5.6.RELEASE och Spring Data Elasticsearch av respektive version. För detta projekt måste vi köra elasticsearch-2.4.5 för att testa våra apis.

Egenskapsfil

Vi kommer att lägga till projektegenskapsfilen (namngivna applications.properties ) i resources som innehåller:

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

Vi kommer att använda standardklustrets namn, värd och port. Som standard används 9300 port som transportport och 9200 port kallas http port. För att se standardklustrnamnet träffa http: // localhost: 9200 / .

Huvudklass (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 är en kombination av @Configuration , @EnableAutoConfiguration , @EnableWebMvc och @ComponentScan kommentarer. Den main() metoden använder Spring Boot s SpringApplication.run() metod för att starta ett program. Där behöver vi ingen xml-konfiguration, den här applikationen är ren Java-vårapplikation.

Elasticsearch Configuration Class (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 klassen konfigurerar elasticsearch till detta projekt och gör en anslutning till elasticsearch. Här används @PropertySource för att läsa filen application.properties där vi lagrar klustrnamnet, elasticsearch-värden och porten. @EnableElasticsearchRepositories används för att aktivera Elasticsearch-arkiv som skannar paketen i den annoterade konfigurationsklassen för Spring Data-arkiv som standard. @Value används här för att läsa egenskaperna från filen application.properties .

Metoden Client() skapar en transportanslutning med elasticsearch. Konfigurationen ovan ställer in en inbäddad Elasticsearch-server som används av ElasticsearchTemplate . ElasticsearchTemplate bönan använder Elasticsearch Client och ger ett anpassat lager för att manipulera data i Elasticsearch.

Modellklass (hälsning.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;
    }
}

Här har vi kommenterat våra Greeting med en @Document-kommentar som vi också kan använda för att bestämma indexinställningar som namn, antal skärvor eller antal kopior. Ett av klassens attribut måste vara ett id , antingen genom att kommentera det med @Id eller använda ett av de automatiskt hittade namnen id eller documentId . Här kommer id fältvärdet att genereras automatiskt om vi inte anger något värde för id fältet.

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

Här har vi utökat ElasticsearchRepository som ger oss många apis som vi inte behöver definiera externt. Detta är baslagringsklassen för elasticsearch baserade domänklasser. Eftersom det sträcker Spring baserat förvars klasser, får vi förmånen att undvika text kod krävs för att genomföra dataåtkomst lager för olika uthållighet butiker.

Här har vi förklarat en metod findByUsername(String username) som konverterar till en matchfråga som matchar med användarnamn med username för Greeting och returnerar listan med resultat.

Tjänster (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);
    }
}

I ovanstående klass har vi @Autowired GreetingRepository . Vi kan helt enkelt kalla CRUDRepository metoderna och den metod vi har deklarerat i förvarsklass med GreetingRepository objektet.

I getAll() kan du hitta en rad Lists.newArrayList(repository.findAll()) . Vi har gjort detta för att konvertera repository.findAll() till List<> eftersom det returnerar en Iterable List.

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

Bygga

För att bygga denna maven ansökningskörning

mvn clean install

Ovanstående kommando först ta bort alla filer i target mapp och bygga projektet. Efter att ha byggt projektet får vi den körbara .jar-filen som heter springdataes-1.0-SNAPSHOT.jar . Vi kan köra huvudklassen ( Application.java ) för att starta processen eller helt enkelt utföra ovanstående burk genom att skriva:

java -jar springdataes-1.0-SNAPSHOT.jar

Kontrollera API: erna

Utför kommandot nedan för att infoga ett hälsningsobjekt i elasticsearch

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

Du bör få nedanstående resultat som

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

Du kan också kontrollera get api genom att köra:

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

Du borde få

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

Du kan kontrollera andra apis genom att följa processerna ovan.

Officiella dokumentationer:



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow