spring-boot
Spring Boot + Spring Data Elasticsearch
Поиск…
Вступление
Spring Data Elasticsearch - это реализация Spring Data для Elasticsearch, которая обеспечивает интеграцию с поисковой системой Elasticsearch .
Интеграция с использованием Spring Boot и Spring Elasticsearch
В этом примере мы собираемся реализовать проект spring-data-elasticsearch для хранения POJO в elasticsearch. Мы увидим пример проекта maven, который выполняет следующие действия:
- Вставьте
Greeting(id, username, message)
в поле поиска elastics. - Получите все приветственные элементы, которые были вставлены.
- Обновите элемент Приветствие.
- Удалить элемент Приветствие.
- Получите ярлык по идентификатору.
- Получите все приветствие по имени пользователя.
Интеграция весов и весов
В этом примере мы увидим приложение весенней загрузки, основанное на maven, которое объединяет поиск spring-data-elasticsearch. Здесь мы сделаем следующее и увидим соответствующие сегменты кода.
- Вставьте
Greeting(id, username, message)
в поле поиска elastics. - Получить все предметы из 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>
Мы будем использовать Spring Boot версии 1.5.6.RELEASE
и Spring Data Elasticsearch соответствующей версии. Для этого проекта нам нужно запустить elasticsearch-2.4.5, чтобы проверить наш apis.
Файл свойств
Мы поместим файл свойств проекта (named applications.properties
) в папку resources
которая содержит:
elasticsearch.clustername = elasticsearch
elasticsearch.host = localhost
elasticsearch.port = 9300
Мы будем использовать имя кластера по умолчанию, хост и порт. По умолчанию порт 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()
использует метод SpringApplication.run()
Spring Boot для запуска приложения. Там нам не нужна какая-либо конфигурация xml, это приложение является чистым java spring application.
Класс конфигурации Elasticsearch (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
используется для включения репозиториев @EnableElasticsearchRepositories
которые по умолчанию сканируют пакеты аннотированного класса конфигурации для хранилищ Spring Data. @Value
используется здесь для чтения свойств из файла application.properties
.
Метод Client()
создает транспортное соединение с elasticsearch. В приведенной выше конфигурации настраивается сервер Embedded Elasticsearch, который используется ElasticsearchTemplate
. Компонент ElasticsearchTemplate
использует Elasticsearch Client
и предоставляет настраиваемый уровень для управления данными в Elasticsearch.
Модельный класс (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
.
Класс репозитория Elasticsearch (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);
}
Здесь мы расширили ElasticsearchRepository
которые предоставляют нам много apis, которые нам не нужно определять извне. Это базовый класс репозитория для классов домена, основанных на elasticsearch
. Поскольку он расширяет классы репозитория Spring
, мы получаем выгоду от избежания шаблона кода, необходимого для реализации уровней доступа к данным для различных хранилищ сохранения.
Здесь мы объявили метод findByUsername(String username)
который преобразует в запрос соответствия, совпадающий с именем пользователя, с полем username
« Greeting
и возвращает список результатов.
Услуги (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);
}
}
В вышеприведенном классе мы @Autowired
GreetingRepository
. Мы можем просто вызвать методы CRUDRepository
и метод, который мы объявили в классе репозитория, с объектом GreetingRepository
.
В getAll()
вы можете найти строку Lists.newArrayList(repository.findAll())
. Мы сделали это, чтобы преобразовать элемент repository.findAll()
в List<>
поскольку он возвращает Iterable
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
папке и построит проект. После создания проекта мы получим исполняемый файл .jar, который называется springdataes-1.0-SNAPSHOT.jar
. Мы можем запустить основной класс ( Application.java
), чтобы запустить процесс или просто выполнить вышеупомянутую банку, набрав:
java -jar springdataes-1.0-SNAPSHOT.jar
Проверка API
Чтобы вставить элемент «Приветствие» в поиск elastics, выполните следующую команду:
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"}]
Вы можете проверить другой apis, выполнив описанные выше процессы.
Официальные документы: