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