Быстрый старт

Взаимодействие с OpenSearch выполняется в том числе посредством Java-клиента и структур данных Java. Данный раздел представляет описание действий по безопасному подключению и работе с индексами и документами в OpenSearch с использованием методов REST API.

Быстрый старт при использовании Java

Для работы сервиса требуется:
  • JDK 11 и выше
Для быстрого старта выполните следующее:
  1. Добавьте зависимость в проект:
    pom.xml type=xml
    <dependency>
        <groupId>org.opensearch.client</groupId>
        <artifactId>opensearch-rest-client</artifactId>
        <version>2.5.0</version>
    </dependency>
    <dependency>
         <groupId>org.opensearch.client</groupId>
         <artifactId>opensearch-java</artifactId>
         <version>2.2.0</version>
    </dependency>
    
    Если используете Gradle, то добавьте следующие зависимости:
    pom.xml type=xml
     dependencies {
        implementation 'org.opensearch.client:opensearch-rest-client: 2.5.0'
        implementation 'org.opensearch.client:opensearch-java:2.2.0'
     }
    
  2. Инициализируйте библиотеку org.opensearch.client.opensearch.OpenSearchClient для взаимодействия с OpenSearch.
    Sample_code type=java
     @Bean
     public OpenSearchClient openSearchClient(RestClient restClient) {
         OpenSearchTransport transport = new RestClientTransport(restClient,
                 new JacksonJsonpMapper(new ObjectMapper().registerModule(new JavaTimeModule())));
    
         return new OpenSearchClient(transport);
     }
    
  3. Инициализируйте RestClient.
    RestClient - это клиент, который общается с OpenSearch через HTTP. В настройке RestClient необходимо указать один или несколько адресов до OpenSearch Coordinator (например, https://opensearch.coord-1:9200, https://opensearch.coord-2:9200).
    Конфигурация OpenSearch по умолчанию содержит базовые учетные данные. Если Java-клиент взаимодействует с вашим кластером OpenSearch, то следует указать ваши учетные данные для аутентификации в OpenSearch.
    Sample_code type=java
    @Bean
    public RestClient restClient(@Value("${opensearch.hosts}") String[] opensearchHosts,
                              SSLContext sslContext) {
     final HttpHost[] httpHosts = Arrays.stream(opensearchHosts).map(HttpHost::create).toArray(HttpHost[]::new);
    
     //Only for demo purposes. Don't specify your credentials in code.
     final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
     credentialsProvider.setCredentials(AuthScope.ANY,
             new UsernamePasswordCredentials("admin", "admin"));
    
     return RestClient.builder(httpHosts)
             .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                     .setDefaultCredentialsProvider(credentialsProvider)
                     .setSSLContext(sslContext)
                     .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE))
             .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(5000)
                     .setSocketTimeout(120000))
             .build();
    }
    
  4. Добавьте сертификаты в программу.
    Sample_code type=java
    System.setProperty("javax.net.ssl.trustStore", "/full/path/to/keystore");
    System.setProperty("javax.net.ssl.trustStorePassword", "password-to-keystore");
    
    При этом важно не инициализировать bean SSLContext.
    Для локальной разработки валидацию сертификатов SSL/TLS можно пропустить, используя инициализацию SSLContext (настройки пропуска валидации сертификатов для протокола SSL).
    Sample_code type=java
    @SneakyThrows
        @Bean
        public SSLContext sslContext() {
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() {
                            return new X509Certificate[0];
                        }
                    public void checkClientTrusted(
                            X509Certificate[] certs, String authType) {
                    }
    
                    public void checkServerTrusted(
                            X509Certificate[] certs, String authType) {
                    }
                }
        };
        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        return sslContext;
    }
    
  5. Создайте Java-класс для хранения основных данных и методов, либо используйте базовый класс IndexData.
    IndexData type=java
    static class IndexData {
      private String firstName;
      private String lastName;
    
      public IndexData(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
      }
    
      public String getFirstName() {
        return firstName;
      }
    
      public void setFirstName(String firstName) {
        this.firstName = firstName;
      }
    
      public String getLastName() {
        return lastName;
      }
    
      public void setLastName(String lastName) {
        this.lastName = lastName;
      }
    
      @Override
      public String toString() {
        return String.format("IndexData{first name='%s', last name='%s'}", firstName, lastName);
      }
    }
    
    Ниже представлен пример, демонстрирующий работу с индексами (создание, запись, удаление) и документами (поиск, удаление) c применением класса IndexData.
    Sample_code type=java
    @Service
    @AllArgsConstructor
    public class OpensearchService {
    
     private final OpenSearchClient client;
    
     //Создание индекса
     @SneakyThrows
     public CreateIndexResponse createIndex(String index) {
         CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(index).build();
         final CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest);
    
         IndexSettings indexSettings = new IndexSettings.Builder().autoExpandReplicas("0-all").build();
         IndexSettingsBody settingsBody = new IndexSettingsBody.Builder().settings(indexSettings).build();
         PutSettingsRequest putSettingsRequest = new PutSettingsRequest.Builder().index(index).value(settingsBody).build();
         client.indices().putSettings(putSettingsRequest);
         return createIndexResponse;
        }
    
     //Запись документа в индекс
     @SneakyThrows
     public IndexResponse writeIndexData(String index, IndexData indexData) {
         IndexRequest<IndexData> indexRequest = new IndexRequest.Builder<IndexData>().index(index).id("2").document(indexData).build();
         return client.index(indexRequest);
        }
    
     //Поиск документов
     @SneakyThrows
     public List<IndexData> searchDocument(String index) {
         SearchResponse<IndexData> searchResponse = client.search(s -> s.index(index), IndexData.class);
         return searchResponse.hits().hits().stream().map(Hit::source).collect(Collectors.toList());
        }
    
     //Удаление документа
     @SneakyThrows
     public DeleteResponse deleteDocument(String index, String id) {
         return client.delete(b -> b.index(index).id(id));
        }
    
     //Удаление индекса
     @SneakyThrows
     public DeleteIndexResponse deleteIndex(String index) {
         DeleteIndexRequest deleteRequest = new DeleteIndexRequest.Builder().index(index).build();
         return client.indices().delete(deleteRequest);
        }
    }
    
  6. Реализуйте уровень контроллера для предоставления API пользователю.
Sample_code type=java
 @AllArgsConstructor
 @Tag(name = "API взаимодействия с OpenSearch")
 @RestController
 public class Controller {

     private OpensearchService opensearchService;

     @Operation(summary = "Создание индекса")
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201", description = "Индекс создан"),
             @ApiResponse(responseCode = "5хх", description = "Ошибка внутри сервиса или OpenSearch")})
     @PostMapping("/index")
     public CreateIndexResponse createIndex(@RequestParam String index) {
         return opensearchService.createIndex(index);
     }

     @Operation(summary = "Запись документа в индекс")
     @PostMapping("/index-data")
     public IndexResponse writeIndexData(@RequestParam String index, @RequestBody IndexData indexData) {
         return opensearchService.writeIndexData(index, indexData);
     }

     @Operation(summary = "Поиск документа")
     @GetMapping("/index-data")
     public List<IndexData> searchDocument(@RequestParam String index) {
         return opensearchService.searchDocument(index);
     }

     @Operation(summary = "Удаление документа")
     @DeleteMapping("/index-data")
     public DeleteResponse deleteDocument(@RequestParam String index, @RequestParam String id) {
         return opensearchService.deleteDocument(index, id);
     }

     @Operation(summary = "Удаление индекса")
     @DeleteMapping("/index")
     public DeleteIndexResponse deleteIndex(@RequestParam String index) {
         return opensearchService.deleteIndex(index);
     }
 }
Предыдущий раздел
1.4 СУБД полнотекстового индекса
Следующий раздел
Работа с данными
Была ли страница полезной?