Поиск…


Вступление

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, выполнив описанные выше процессы.

Официальные документы:



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow