spring-boot
Spring Boot + Spring Data Elasticsearch
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: