Быстрый старт
Взаимодействие с OpenSearch выполняется в том числе посредством Java-клиента и структур данных Java.
Данный раздел представляет описание действий по безопасному подключению и работе с индексами и документами в OpenSearch с использованием методов REST API.
Для работы сервиса требуется:
- JDK 11 и выше
Для быстрого старта выполните следующее:
-
Добавьте зависимость в проект: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=xmldependencies { implementation 'org.opensearch.client:opensearch-rest-client: 2.5.0' implementation 'org.opensearch.client:opensearch-java:2.2.0' }
-
Инициализируйте библиотеку
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); }
-
Инициализируйте 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(); }
-
Добавьте сертификаты в программу.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; }
-
Создайте Java-класс для хранения основных данных и методов, либо используйте базовый класс
IndexData
.IndexData type=javastatic 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); } }
-
Реализуйте уровень контроллера для предоставления 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); } }