spring-boot
봄 부팅 + 봄 데이터 탄성 검색
수색…
소개
Spring Data Elasticsearch 는 Elasticsearch 검색 엔진과의 통합을 제공하는 Elasticsearch 용 Spring Data 구현입니다.
스프링 부트 및 스프링 데이터 Elasticsearch 통합
이 예제에서 우리는 elasticsearch에 POJO를 저장하기 위해 spring-data-elasticsearch 프로젝트를 구현할 것이다. 우리는 다음을 수행하는 샘플 maven 프로젝트를 볼 것입니다 :
-
Greeting(id, username, message)
항목을 elasticsearch에 삽입하십시오. - 삽입 된 인사말 항목 모두 가져 오기.
- 인사말 항목 업데이트.
- 인사말 항목 삭제.
- 인사말 항목을 ID로 가져옵니다.
- 모든 인사말 항목을 사용자 이름으로 가져옵니다.
스프링 부트 및 스프링 데이터 elasticsearch 통합
이 예제에서는 spring-data-elasticsearch를 통합 한 maven 기반의 스프링 부팅 응용 프로그램을 보게됩니다. 여기서는 다음을 수행하고 각각의 코드 세그먼트를 볼 것입니다.
-
Greeting(id, username, message)
항목을 elasticsearch에 삽입하십시오. - elasticsearch에서 모든 항목 가져 오기
- 특정 항목을 업데이트하십시오.
- 특정 항목을 삭제하십시오.
- 특정 항목을 ID로 가져옵니다.
- 사용자 이름별로 특정 항목을 가져옵니다.
프로젝트 구성 파일 (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>
우리는 버전 1.5.6.RELEASE
의 Spring Boot 를 사용할 것입니다 1.5.6.RELEASE
와 해당 버전의 Spring Data Elasticsearch . 이 프로젝트에서는 api를 테스트하기 위해 elasticsearch-2.4.5 를 실행해야합니다.
특성 파일
다음을 포함하는 resources
폴더에 프로젝트 등록 정보 파일 ( applications.properties
)을 저장합니다.
elasticsearch.clustername = elasticsearch
elasticsearch.host = localhost
elasticsearch.port = 9300
기본 클러스터 이름 인 host 및 port를 사용합니다. 기본적으로 9300
포트는 전송 포트로 사용되고 9200
포트는 http 포트로 사용됩니다. 기본 클러스터 이름을 보려면 http : // localhost : 9200 /을 누르십시오.
메인 클래스 (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
은 @Configuration
, @EnableAutoConfiguration
, @EnableWebMvc
및 @ComponentScan
주석의 조합입니다. main()
메소드는 Spring Boot의 SpringApplication.run()
메소드를 사용하여 애플리케이션을 시작한다. 거기에 우리는 어떤 XML 구성이 필요하지 않습니다,이 응용 프로그램은 순수 자바 봄 응용 프로그램입니다.
탄성 검색 구성 클래스 (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
클래스는이 프로젝트에 elasticsearch를 구성하고 elasticsearch와 연결합니다. 여기에서 @PropertySource
는 application.properties
파일을 읽는 데 사용됩니다.이 파일에서 클러스터 이름, elasticsearch 호스트 및 포트를 저장합니다. @EnableElasticsearchRepositories
는 기본적으로 스프링 데이터 저장소에 대한 주석이 달린 구성 클래스의 패키지를 검사하는 Elasticsearch 저장소를 활성화하는 데 사용됩니다. 여기서 @Value
는 application.properties
파일에서 특성을 읽는 데 사용됩니다.
Client()
메서드는 elasticsearch를 사용하여 전송 연결을 만듭니다. 위의 구성은 ElasticsearchTemplate
사용하는 Embedded Elasticsearch Server를 설정합니다. ElasticsearchTemplate
빈은 Elasticsearch Client
사용하고 Elasticsearch Client
에서 데이터를 조작하기위한 사용자 정의 계층을 제공합니다.
모델 클래스 (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;
}
}
여기서 Greeting
데이터 객체에 @Document 주석을 주석으로 추가했습니다. 이름, 샤드 수 또는 복제본 수와 같은 색인 설정을 결정하는 데 사용할 수도 있습니다. 클래스의 속성 중 하나는 할 필요가 id
, 하나와 주석으로 @Id
또는 자동으로 발견 이름 중 하나를 사용하여 id
또는 documentId
. 여기서, id
우리가 값 설정하지 않으면 필드의 값은 자동으로 생성 될 것입니다 id
필드.
탄성 검색 저장소 클래스 (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);
}
여기서 우리는 외부에서 정의 할 필요가없는 많은 api를 제공하는 ElasticsearchRepository
를 확장했습니다. 이것은 elasticsearch
기반 도메인 클래스의 기본 저장소 클래스입니다. Spring
기반 저장소 클래스를 확장하므로 다양한 지속성 저장소에 대한 데이터 액세스 계층을 구현하는 데 필요한 상용구 코드를 피할 수 있습니다.
여기서 우리는 findByUsername(String username)
메서드를 선언했습니다.이 메소드는 username과 일치하는 일치 쿼리로 변환되어 Greeting
객체의 username
필드와 일치하고 결과 목록을 반환합니다.
서비스 (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);
}
서비스 빈 (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);
}
}
위 클래스에서는 GreetingRepository
@Autowired
했습니다. GreetingRepository
객체를 사용하여 CRUDRepository
메소드와 저장소 클래스에서 선언 한 메소드를 간단하게 호출 할 수 있습니다.
getAll()
메소드에서 Lists.newArrayList(repository.findAll())
행을 찾을 수 있습니다. 우리는 repository.findAll()
을 Iterable
List를 반환 할 때 List<>
항목으로 변환하기 위해이 작업을 수행했습니다.
컨트롤러 클래스 (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);
}
}
짓다
이 Maven 애플리케이션을 빌드하려면
mvn clean install
위의 명령은 먼저 target
폴더의 모든 파일을 제거하고 프로젝트를 빌드합니다. 프로젝트를 빌드 한 후 springdataes-1.0-SNAPSHOT.jar
이라는 실행 가능 .jar 파일을 가져옵니다. 메인 클래스 ( Application.java
)를 실행하여 프로세스를 시작하거나 간단히 위의 jar를 실행하여 다음을 입력 할 수 있습니다.
java -jar springdataes-1.0-SNAPSHOT.jar
API 확인
elasticsearch에 인사말 항목을 삽입하려면 아래 명령을 실행하십시오.
curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is a message"}' http://localhost:8080/api/greetings
다음과 같은 결과를 얻을 수 있습니다.
{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}
다음을 실행하여 get api를 확인할 수도 있습니다.
curl -H "Content-Type: application/json" -X GET http://localhost:8080/api/greetings
너는 도착해야한다.
[{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}]
위의 절차에 따라 다른 api를 확인할 수 있습니다.
공식 문서 :