Статьи

Spring Boot и Elasticsearch Учебное пособие

обзор

В моей последней статье я говорил о том, как мы можем использовать проект Spring-Data-Elasticsearch для соединения с механизмом Elasticsearch и выполнения операций CRUD. Однако я также упомянул, что этот проект не обновлен, чтобы быть совместимым с последней версией механизма Elasticsearch .

Итак, в этом посте я расскажу о том, как взаимодействовать с последней версией механизма Elasticsearch с помощью библиотеки клиента транспорта. Я собираюсь использовать Spring Boot в качестве клиентского приложения, а затем добавить зависимости для других необходимых библиотек.

Предпосылки

  • JDK 1.8

  • специалист

  • Загрузка движка Elasticsearch 5.x или 6.x (я объясню шаги как скачать)

  • Затмение или VSD как IDE

Настройка Elasticsearch 

Шаг 1  — Зайдите на официальный сайт Elastic .

Шаг 2  — Выберите Elasticsearch в раскрывающемся списке, а затем версию как 5.5.0 и нажмите кнопку «Загрузить».

Шаг 3  — Он даст вам варианты, если вы хотите скачать в виде файла Zip, TAR или RPM. Я выбрал формат Zip, используя его в Windows.

Шаг 4  — Распакуйте загруженный контент и перейдите в  binпапку. Там будет файл с именем elasticsearch.bat.

Шаг 5  — Запустите этот файл в ОС Windows через командную строку, и он запустит для вас механизм Elasticsearch. После запуска он начнет прослушивать порт 9200. Поэтому URL будет  http: // localhost: 9200 / . Кроме того, порт 9300 представлен как узел кластера. Порт 9200 предназначен для связи REST и может использоваться Java или любым другим языком, а 9300 также для связи Elasticsearch Cluster Node, и Java также может подключаться к этому узлу кластера с использованием транспортного протокола.

Шаг 6  — Проверьте, чтобы все началось правильно, запустив URL с помощью команды curl. Вы можете использовать PowerShell в Windows.

curl http://localhost:9200/

StatusCode        : 200
StatusDescription : OK
Content           : {
                      "name" : "ggyBmti",
                      "cluster_name" : "elasticsearch",
                      "cluster_uuid" : "Bp6EeKIoQNqGj0iV5sHtWg",
                      "version" : {
                        "number" : "5.5.0",
                        "build_hash" : "260387d",
                        "build_date" : "2017-...
RawContent        : HTTP/1.1 200 OK
                    Content-Length: 327
                    Content-Type: application/json; charset=UTF-8

                    {
                      "name" : "ggyBmti",
                      "cluster_name" : "elasticsearch",
                      "cluster_uuid" : "Bp6EeKIoQNqGj0iV5sHtWg",
                      "versi...
Forms             : {}
Headers           : {[Content-Length, 327], [Content-Type, application/json; charset=UTF-8]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 327

Как только поисковая система запустится, давайте попробуем протестировать некоторые из API REST, которые она предоставляет для взаимодействия с движком.

Запустите  http://localhost:9200/users/employee/1 с помощью Почтальона или сверните с POST методом Ввод должен быть в формате JSON.

{
  "userId" :"1",
  "name" : "Rajesh",
   "userSettings" : {
   "gender" : "male",
   "occupation" : "CA",
   "hobby" : "chess"
   }
}

Ответ покажет, что он создал « users » в качестве имени индекса, «employee» в качестве типа и что документ был создан с идентификатором «1».

{
"_index": "users",
"_type": "employee",
"_id": "1",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": false
}

Теперь, чтобы просмотреть содержимое документа, мы можем вызвать другую конечную точку API REST,  http://localhost:9200/users/employee/1используя  GET метод. Это приведет к следующей информации документа:

{
"_index": "users",
"_type": "employee",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"userId": "1",
"name": "Rajesh",
"userSettings": {
"gender": "male",
"occupation": "CA",
"hobby": "chess"
}
}
}

Теперь, если мы хотим выполнить поиск документа по какому-либо конкретному полю, вам нужно добавить   _search путь к URL-адресу REST API. Чтобы запустить это, выполните следующую команду: curl -XGET 'http://localhost:9200/users/employee/_search' 

Будет выполнен поиск всех документов с индексом «пользователи» и типом «сотрудник». Теперь, если вы хотите выполнить поиск определенного поля, вам нужно добавить несколько критериев соответствия запроса как часть вашего JSON.

 curl -XGET 'http://localhost:9200/users/employee/_search'
-H 'Content-Type: application/json' -d
' {"query": { "match": {"name" : "Rajesh" } }}'

При этом будет выполнен поиск документа с полем «имя», установленным как «Раджеш».

Теперь мы увидели, как работают API-интерфейсы Elasticsearch REST для создания, извлечения и других операций с документами; давайте попробуем понять, как мы можем подключиться к движку Elasticsearch к нашему коду приложения. Мы можем либо вызывать эти API REST напрямую из кода, либо использовать транспортный клиент, предоставляемый Elasticsearch. Давайте разработаем приложение Spring Boot, чтобы продемонстрировать все операции CRUD.

Разработка приложения Spring Boot

Maven Зависимости 

Кроме Jar-файлов Spring Boot нам нужны Elasticsearch, транспортный клиент и jar log4j.

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.0.0</version>
</dependency>

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.7</version>
</dependency>
</dependencies>

конфигурация

Поскольку мы будем использовать транспортный клиент для подключения к механизму Elasticsearch, нам необходимо указать URL-адрес для узла кластера механизма. поэтому я поместил свойства в файл application.properties для хоста и порта URL.

# Local Elasticsearch config
elasticsearch.host=localhost
elasticsearch.port=9300


# App config
server.port=8102
spring.application.name=BootElastic

Домен

Создайте класс домена с именем User. Вход JSON будет сопоставлен с этим  User объектом. Это будет использоваться для создания пользовательского документа, связанного с индексом и типом. 

public class User {
    private String userId;
    private String name;
    private Date creationDate = new Date();
    private Map<String, String> userSettings = new HashMap<>();
  -- getter/setter methods
}

конфигурация

Файл конфигурации Java был создан для создания транспортного клиента, который подключается к узлу кластера Elasticsearch. Он также загружает значение хоста и порта из среды, настроенной через  файл application.properties .

@Configuration
public class config{

    @Value("${elasticsearch.host:localhost}") 
    public String host;
    @Value("${elasticsearch.port:9300}") 
    public int port;

    public String getHost() {
return host;
}


public int getPort() {
return port;
    }

    @Bean
    public Client client(){
        TransportClient client = null;
        try{
            System.out.println("host:"+ host+"port:"+port);
            client = new PreBuiltTransportClient(Settings.EMPTY)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return client;
    }
}

контроллер

UserController создан для демонстрации следующих функций:

  1. Создайте индекс с именем « users » и введите « employee». Он создаст документ для хранения информации о пользователе. Идентификатор документа может быть передан как ввод JSON или, если он не передан, Elasticsearch сгенерирует свой собственный идентификатор. Клиент имеет метод , называемый  prepareIndex() ш HICH строит объект документа и хранить в отношении индекса и типа. Этот метод является  POST вызовом метода, где  User информация будет передаваться как JSON.

@Autowired
    Client client;
    @PostMapping("/create")
    public String create(@RequestBody User user) throws IOException {

        IndexResponse response = client.prepareIndex("users", "employee", user.getUserId())
                .setSource(jsonBuilder()
                        .startObject()
                        .field("name", user.getName())
                        .field("userSettings", user.getUserSettings())
                        .endObject()
                )
                .get();
               System.out.println("response id:"+response.getId());
        return response.getResult().toString();
    }

2. Просмотрите информацию о пользователе, основываясь на переданном tge «id» У клиента есть  prepareGet() метод для извлечения информации на основе индекса, типа и идентификатора. Он вернет информацию о пользователе в формате JSON. 

 @GetMapping("/view/{id}")
    public Map<String, Object> view(@PathVariable final String id) {
        GetResponse getResponse = client.prepareGet("users", "employee", id).get();
        return getResponse.getSource();
    }

3. Просмотр информации о пользователе на основе имени поля. Я использовал  matchQuery() здесь для поиска по полю « имя » и вернуть  User информацию. Тем не менее, есть много различных типов доступных с   классом. Например, используйте  для поиска значения поля в определенном диапазоне, например, в возрасте от 10 до 20 лет. Существует    метод для поиска поля с подстановочным знаком. также доступно. Вы можете играть со всем этим в зависимости от ваших потребностей. query() QueryBuilders rangeQuery() wildcardQuery() termQuery()

    @GetMapping("/view/name/{field}")
    public Map<String, Object> searchByName(@PathVariable final String field) {
        Map<String,Object> map = null;
        SearchResponse response = client.prepareSearch("users")
                                .setTypes("employee")
                                .setSearchType(SearchType.QUERY_AND_FETCH)
                                .setQuery(QueryBuilders..matchQuery("name", field))
                                .get()
                                ;
        List<SearchHit> searchHits = Arrays.asList(response.getHits().getHits());
        map =   searchHits.get(0).getSource();
        return map;

    }

4. Обновите документ, выполнив поиск по Id, и замените значение поля. У клиента есть метод с именем   update(). Он принимает в  UpdateRequest качестве входных данных, который создает запрос на обновление.

    @GetMapping("/update/{id}")
    public String update(@PathVariable final String id) throws IOException {

        UpdateRequest updateRequest = new UpdateRequest();
        updateRequest.index("users")
                .type("employee")
                .id(id)
                .doc(jsonBuilder()
                        .startObject()
                        .field("name", "Rajesh")
                        .endObject());
        try {
            UpdateResponse updateResponse = client.update(updateRequest).get();
            System.out.println(updateResponse.status());
            return updateResponse.status().toString();
        } catch (InterruptedException | ExecutionException e) {
            System.out.println(e);
        }
        return "Exception";
    }

5. Последний способ — показать, как удалить документ с указателем и типом. У клиента есть  prepareDelete() метод, который принимает индекс, тип и идентификатор для удаления документа. 

   @GetMapping("/delete/{id}")
    public String delete(@PathVariable final String id) {
        DeleteResponse deleteResponse = client.prepareDelete("users", "employee", id).get();
        return deleteResponse.getResult().toString();
    }

Полный код был помещен на GitHub .

Создайте приложение

Запустите  mvn clean install команду для создания файла JAR.

Запустить приложение

Запустите  java -jar target/standalone-elasticsearch-0.0.1-SNAPSHOT.jarкоманду, чтобы запустить приложение Spring Boot.

Тестовое приложение

Приложение будет запущено по  http://localhost:8102URL. Теперь давайте проверим пару вариантов использования, о которых мы говорили выше.

1. Тест для создания документа.

Запустите  http://localhost:8102/rest/users/create в качестве  POST метода либо через курьера Почтальон.

Входные данные:

{
  "userId":"1",
  "name": "Sumit",
   "userSettings": {
   "gender" : "male",
   "occupation" : "CA",
   "hobby" : "chess"
   }
}

Вы увидите ответ с надписью «СОЗДАН».

2. Чтобы проверить, был ли документ создан, давайте проверим функциональность представления.

Запустите http://localhost:8102/rest/users/view/1 с  GET методом.

В ответ вы увидите информацию о пользователе для идентификатора со значением «1».

{
"userSettings": {
"occupation": "CA",
"gender": "male",
"hobby": "chess"
},
"name": "Rajesh"
}

3. Вы также можете просмотреть информацию о пользователе через поле имени, запустив  http://localhost:8102/rest/users/view/name/Rajesh. Это передает «Раджеш» в качестве значения поля «имя».

Аналогично, функции обновления и удаления можно протестировать, запустив  http://localhost:8102/rest/users/update/1  и  http://localhost:8102/rest/users/delete/1.

Это все особенности, с которыми я играл. Как уже упоминалось выше, существует много разных типов запросов, которые вы можете исследовать с помощью транспортного клиента Elasticsearch.