从零开发短视频电商 AWS OpenSearch Service开发环境申请以及Java客户端介绍

文章目录

    • 创建域
      • 1.创建域
      • 2.输入配置
        • 部署选项
        • 数据节点
        • 网络
        • 精细访问控制
        • 访问策略
    • 获取域端点
    • 数据如何插入到OpenSearch Service
    • Java连接OpenSearch Service
      • spring-data-opensearch
      • elasticsearch-rest-high-level-client
      • opensearch-rest-client
      • opensearch-java

因为是开发测试使用,所以选的都是低配,单机,便宜的配置。

地址:https://aws.amazon.com/cn/opensearch-service/

价格:https://aws.amazon.com/cn/opensearch-service/pricing/

  • 实例小时数 +
  • 所需的存储量 +
  • 传入和传出 Amazon OpenSearch Service 的数据

文档:https://docs.aws.amazon.com/zh_cn/opensearch-service/

创建域

一般在15-30分钟内创建一个OpenSearch集群,所以请尿完尿再来搞,别憋坏了。

1.创建域

2.输入配置

  • 域名:后面用java等客户端连接时会在URL中显示。

  • 域创建方法:请选择标准创建

    • 轻松创建:快速创建 OpenSearch 域以实现高可用性 含备用节点的多可用区,我们要自定义标准创建便宜点。可以理解为一个产线的标准套餐。
    • 标准创建:就是自选套餐。
  • 模板:选择开发/测试

  • 部署选项:选择不含备用节点的域,主打的就是便宜能用就行。
  • 可用区:选择一个可用区。
  • 版本:请选择最新版本。
部署选项

数据节点
  • 实例类型:默认是内存优化 - r6g.large.search,2C16G 价格为USD 0.167/H,下面列几个便宜的。
    • t3.small.search 2C2G USD 0.036 ,自己用来个最便宜的,又不是不能用。
    • t3.medium.search 2C4G USD 0.073
  • 节点数:1个就行。
  • 存储大小:40G就行。

忽略其他冷热数据存储专用主节点快照配置,以及自定义终端节点部分。

网络
  • 网络:选择 Public access(公有访问权限)
    • 开发测试环境,选择公共访问权限,生成用VPC访问

精细访问控制

启用细粒度访问控制复选框。选择创建主用户输入用户名和密码,用户名和密码很关键,后面访问dashboard和远程客户端连接都要。

忽略 SAML 身份验证Amazon Cognito 身份验证

访问策略

选择 Only use fine-grained access control(仅使用精细访问控制)

忽略其余设置,然后选择 Create(创建)。新域初始化过程通常需要 15-30 分钟,但可能需要更长的时间,具体取决于配置。

获取域端点

点击创建后,通常需要 15-30 分钟,然后从控制台 -> 域 -> 一般信息 获取域端点。

这里给了IPV6和IPV4的dashboard地址和域端点地址。

数据如何插入到OpenSearch Service

  • 对于大规模数据,我们建议使用 Amazon Kinesis Data Firehose,这是一项完全托管的服务,可以自动扩展以匹配您的数据吞吐量,并且不需要进行持续的管理。它还可以在加载数据前对其进行转换、批处理和压缩。
  • Amazon OpenSearch Service 支持与 Logstash 的集成。您可以将 Amazon OpenSearch Service 域配置为数据存储,用于存储所有来自 Logstash 的日志。
  • 可以使用索引 API 和批量 API 等原生 Elasticsearch(7.10 及更低版本)或 OpenSearch API 将数据加载到域中。

Java连接OpenSearch Service

当使用 Java 连接 OpenSearch 时,有几个选择,包括 Spring Data Elasticsearch/opensearch、原生 Elasticsearch 和 OpenSearch 客户端。下面是每种方式的简要介绍:

  • spring-data-xxx
  • 原生Elasticsearch
  • OpenSearch

建议基本的CRUD用 spring-data-xxx

复杂的查询用低级client,如opensearch-java
RestClient lowLevelClient = highLevelClient.getLowLevelClient();
lowLevelClient . lowLevelClient.performRequest()

验证分为用户名和密码进行身份验证AWS访问密钥(Access Key和Secret Key)
我们当前选的精细控制用的是用户名密码验证,后面生产建议改为IAM验证。

spring-data-opensearch

  • Github:https://github.com/opensearch-project/spring-data-opensearch

  • 官方示例:https://github.com/opensearch-project/spring-data-opensearch/tree/main/spring-data-opensearch-examples

Spring Boot 3.x

1.添加依赖。

<dependency><groupId>org.opensearch.client</groupId><artifactId>spring-data-opensearch-starter</artifactId><version>1.3.0</version>
</dependency>

2.启动类去除ElasticsearchDataAutoConfiguration自动配置。

@SpringBootApplication(exclude = {ElasticsearchDataAutoConfiguration.class})
public class OpenSearchDemoApplication {public static void main(String[] args) {SpringApplication.run(OpenSearchDemoApplication.class, args);}
}

3.application.yml增加配置

opensearch:uris: https://localhost:9200username: adminpassword: adminspring:jackson:serialization:INDENT_OUTPUT: true

4.新增model

import java.math.BigDecimal;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;@Document(indexName = "marketplace")
public class Product {@Idprivate String id;@Field(type = FieldType.Text, name = "name")private String name;@Field(type = FieldType.Double, name = "price")private BigDecimal price;@Field(type = FieldType.Integer, name = "quantity")private Integer quantity;@Field(type = FieldType.Text, name = "description")private String description;@Field(type = FieldType.Keyword, name = "vendor")private String vendor;

5.新增Repository

import java.math.BigDecimal;
import java.util.List;
import org.opensearch.data.example.model.Product;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;@Repository
public interface MarketplaceRepository extends ElasticsearchRepository<Product, String> {List<Product> findByNameLikeAndPriceGreaterThan(String name, BigDecimal price);
}

6.新增service

@Service
public class  MarketplaceService {private final MarketplaceRepository repository;public MyService(MarketplaceRepository repository) {this.repository = repository;}public void doWork() {repository.deleteAll();Product product = new Product();product.setName("xxx");product.setxxx("xxx");repository.save(product);List<Product> results = repository.findByNameLikeAndPriceGreaterThan("Gierke",xx);}
}

我们还可以通过RestHighLevelClient获得lowLevelRest()客户端。

  @AutowiredRestHighLevelClient highLevelClient;RestClient lowLevelClient = highLevelClient.getLowLevelClient();IndexRequest request = new IndexRequest("spring-data").id(randomID()).source(singletonMap("feature", "high-level-rest-client")).setRefreshPolicy(IMMEDIATE);
IndexResponse response = highLevelClient.index(request,RequestOptions.DEFAULT);// 构建请求Request request = new Request("GET", "/your-index-name/_search");// 添加请求参数,如果需要的话request.addParameter("q", "field:value");// 执行请求Response response = lowLevelClient.performRequest(request);// 处理响应int statusCode = response.getStatusLine().getStatusCode();String responseBody = EntityUtils.toString(response.getEntity());System.out.println("Status Code: " + statusCode);System.out.println("Response Body: " + responseBody);

elasticsearch-rest-high-level-client

1.添加依赖

<dependencies><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.10.2</version> <!-- 替换为你使用的OpenSearch版本 --></dependency>
</dependencies>

2.示例代码

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;public class OpenSearchExample {public static void main(String[] args) {// OpenSearch连接配置String hostname = "your_opensearch_host"; // 替换为你的OpenSearch服务器主机名或IP地址int port = 9200; // 替换为你的OpenSearch服务器端口String scheme = "https"; // 如果使用HTTPS,否则使用"http"String username = "laker";String password = "lakerpwd";try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(hostname).setPort(port).setScheme(scheme).setHttpClientConfigCallback(httpClientBuilder ->httpClientBuilder.setDefaultCredentialsProvider(() ->new org.apache.http.auth.UsernamePasswordCredentials(username, password))))) {// 上传数据Map<String, Object> jsonMap = new HashMap<>();jsonMap.put("field1", "value1");jsonMap.put("field2", "value2");IndexRequest indexRequest = new IndexRequest("your_index").id("your_document_id") // 替换为文档的ID.source(jsonMap, XContentType.JSON);IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);System.out.println("Index created with ID: " + indexResponse.getId());// 查询数据SearchRequest searchRequest = new SearchRequest("your_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();searchSourceBuilder.query(QueryBuilders.matchAllQuery());searchRequest.source(searchSourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 处理查询结果System.out.println("Search hits: " + searchResponse.getHits().getTotalHits());} catch (IOException e) {e.printStackTrace();}}
}

opensearch-rest-client

  • 文档:https://opensearch.org/docs/latest/clients/java-rest-high-level/

1.添加依赖

        <dependency><groupId>org.opensearch.client</groupId><artifactId>opensearch-rest-high-level-client</artifactId><version>2.11.1</version></dependency>

2.示例代码

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.opensearch.action.admin.indices.delete.DeleteIndexRequest;
import org.opensearch.action.delete.DeleteRequest;
import org.opensearch.action.delete.DeleteResponse;
import org.opensearch.action.get.GetRequest;
import org.opensearch.action.get.GetResponse;
import org.opensearch.action.index.IndexRequest;
import org.opensearch.action.index.IndexResponse;
import org.opensearch.action.support.master.AcknowledgedResponse;
import org.opensearch.client.RequestOptions;
import org.opensearch.client.RestClient;
import org.opensearch.client.RestClientBuilder;
import org.opensearch.client.RestHighLevelClient;
import org.opensearch.client.indices.CreateIndexRequest;
import org.opensearch.client.indices.CreateIndexResponse;
import org.opensearch.common.settings.Settings;import java.io.IOException;
import java.util.HashMap;public class RESTClientSample {public static void main(String[] args) throws IOException {final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("lakertest", "xxxx"));//Create a client.RestClientBuilder builder = RestClient.builder(new HttpHost("search-laker-search-xxxx.us-east-2.es.amazonaws.com", 443, "https")).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));RestHighLevelClient client = new RestHighLevelClient(builder);//Create a non-default index with custom settings and mappings.CreateIndexRequest createIndexRequest = new CreateIndexRequest("custom-index");createIndexRequest.settings(Settings.builder() //Specify in the settings how many shards you want in the index..put("index.number_of_shards", 4).put("index.number_of_replicas", 3));//Create a set of maps for the index's mappings.HashMap<String, String> typeMapping = new HashMap<String,String>();typeMapping.put("type", "integer");HashMap<String, Object> ageMapping = new HashMap<String, Object>();ageMapping.put("age", typeMapping);HashMap<String, Object> mapping = new HashMap<String, Object>();mapping.put("properties", ageMapping);createIndexRequest.mapping(mapping);CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);//Adding data to the index.IndexRequest request = new IndexRequest("custom-index"); //Add a document to the custom-index we created.request.id("1"); //Assign an ID to the document.HashMap<String, String> stringMapping = new HashMap<String, String>();stringMapping.put("message:", "Testing Java REST client");request.source(stringMapping); //Place your content into the index's source.IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);// 查询GetRequest getRequest = new GetRequest("custom-index", "1");GetResponse response = client.get(getRequest, RequestOptions.DEFAULT);System.out.println(response.getSourceAsString());// 删除文档DeleteRequest deleteDocumentRequest = new DeleteRequest("custom-index", "1"); //Index name followed by the ID.DeleteResponse deleteResponse = client.delete(deleteDocumentRequest, RequestOptions.DEFAULT);// 删除索引DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("custom-index"); //Index name.AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);client.close();}
}

opensearch-java

  • 文档:https://opensearch.org/docs/latest/clients/java/
  • 示例代码:https://github.com/opensearch-project/opensearch-java/tree/main/samples
    • 里面很详细,包含knn部分。
<dependency><groupId>org.opensearch.client</groupId><artifactId>opensearch-java</artifactId><version>2.8.1</version>
</dependency>
@Data
public class IndexData {private String title;private String text;public IndexData() {}public IndexData(String title, String text) {this.title = title;this.text = text;}
}
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.opensearch.client.RestClient;
import org.opensearch.client.json.jackson.JacksonJsonpMapper;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch._types.mapping.IntegerNumberProperty;
import org.opensearch.client.opensearch._types.mapping.Property;
import org.opensearch.client.opensearch._types.mapping.TypeMapping;
import org.opensearch.client.opensearch.core.IndexRequest;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
import org.opensearch.client.opensearch.indices.DeleteIndexRequest;
import org.opensearch.client.opensearch.indices.IndexSettings;
import org.opensearch.client.transport.OpenSearchTransport;
import org.opensearch.client.transport.rest_client.RestClientTransport;import java.io.IOException;public class OpenSearchClientExample {public static void main(String[] args) throws IOException {final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("admin", "admin"));// 私有 opensearchRestClient restClient = RestClient.builder(new HttpHost("localhost", 9200, "https")).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)).build();OpenSearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());OpenSearchClient client = new OpenSearchClient(transport);//Create the indexString indexName = "sample-index";//Add some settings to the indexIndexSettings settings = new IndexSettings.Builder().numberOfShards("2").numberOfReplicas("1").build();TypeMapping mapping = new TypeMapping.Builder().properties("age",new Property.Builder().integer(new IntegerNumberProperty.Builder().build()).build()).build();CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(indexName).settings(settings).mappings(mapping).build();client.indices().create(createIndexRequest);//Index some dataIndexData indexData = new IndexData("Document 1", "Text for document 1");IndexRequest<IndexData> indexRequest = new IndexRequest.Builder<IndexData>().index(indexName).id("1").document(indexData).build();client.index(indexRequest);//Search for the documentSearchResponse<IndexData> searchResponse = client.search(s -> s.index(indexName), IndexData.class);for (int i = 0; i < searchResponse.hits().hits().size(); i++) {System.out.println(searchResponse.hits().hits().get(i).source());}//Delete the documentclient.delete(b -> b.index(indexName).id("1"));// Delete the indexDeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder().index(indexName).build();client.indices().delete(deleteIndexRequest);try {if (restClient != null) {restClient.close();}} catch (IOException e) {System.out.println(e.toString());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/258313.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《论文阅读》用于情绪回复生成的情绪正则化条件变分自动编码器 Affective Computing 2021

《论文阅读》用于情绪回复生成的情绪正则化条件变分自动编码器 前言简介模型结构实验结果总结前言 今天为大家带来的是《Emotion-Regularized Conditional Variational Autoencoder for Emotional Response Generation》 出版:IEEE Transactions on Affective Computing 时间…

Gateway和spring-boot-starter-web的恩怨情仇

为什么取这个题目&#xff0c;其实与我踩到的坑有关&#xff0c;说起来这个坑非常神奇&#xff0c;这里面就涉及到Gateway和spring-boot-starter-web底层所依赖的技术不兼容的问题。 一、背景 SpringCloud 版本 ---- Finchley.SR2 SpringBoot 版本 ---- 2.0.6.RELEASE 如果同…

Qt使用Cryptopp生成HMAC-MD5

近期项目中HTTPS通讯中&#xff0c;token需要使用HMAC-MD5算法生成&#xff0c;往上找了一些资料后&#xff0c;仍不能满足自身需求&#xff0c;故次一记。 前期准备&#xff1a; ①下载Cryptopp库&#xff08;我下载的是8.8.0 Release版本&#xff09;&#xff1a;Crypto Li…

四川思维跳动商务信息咨询有限公司正规吗?

当今的电商市场&#xff0c;平台众多&#xff0c;竞争激烈。其中&#xff0c;抖音电商以其独特的社交模式和精准的推荐算法赢得了众多商家的青睐。然而&#xff0c;随着市场的扩大&#xff0c;许多商家可能对如何在抖音电商平台上进行合规经营感到困惑。此时&#xff0c;四川思…

【C#设计模式 + Filter】装饰器模式专项——过滤器

c# 装饰器模式专项——过滤器 装饰器模式专项——过滤器Filter1.winform实现通过特性改控件名称&#xff08;.Framework)2.手写过滤器 (.NET Core) 装饰器模式专项——过滤器Filter 左边为api启动流程。 右边为需要实现的winform启动流程。右边大框里面需要我们手动实现。 1.wi…

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

git 克隆无权限-重新输入账号密码

克隆项目代码时提示没有权限&#xff0c;有可能是没有登录账号&#xff0c;也可能是账号密码改了&#xff0c;运行下面指令&#xff0c;然后重新克隆项目&#xff0c;下载的时候会让你重新输入账号密码&#xff0c;则克隆成功 git config --global credential.helper cache 参考…

基于 ESP32-S3 的 Walter 开发板

Walter 是一款基于 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。 近日&#xff0c;比利时公司 DPTechnics BV 推出了一款基于乐鑫 ESP32-S3 且拥有 5G LTE 连接功能的新型开源开发套件。该套件即将在 Crowd Supply 平台上发布&#xff0c;您可以点击此处了解详情。 无…

云安全技术包括哪些?

云安全技术是随着云计算技术的发展而衍生出来的一种安全技术&#xff0c;它利用云计算的分布式处理和数据存储能力&#xff0c;实现对海量数据的快速处理和存储&#xff0c;同时采用机器学习和人工智能技术对数据进行分析和挖掘&#xff0c;以便更好地发现和防御安全威胁。云安…

temu防窒息警示语贴哪里

防窒息警示语标签的位置选择是确保消费者在购买和使用产品时能够注意到潜在窒息风险的重要一环。本文将为您介绍一些关于防窒息警示语标签贴在哪里的建议&#xff0c;以帮助您选择合适的位置。 先给大家推荐一款拼多多/temu运营工具——多多情报通 多多情报通是拼多多的生意参…

SPA, SEO, SSR总结

SPA单页面Web应用 SPA(Single page web application) 单页面Web应用 Web不再是一张张页面,而是一个整体的应用,一个由路由系统,数据系统,页面(组件)系统等等,组成的应用程序, 让用户不需要每次与服务器进行页面刷新来获得新的内容, 从而提供了更快,跟流畅的用户体验, 在SPA中…

文献速递:多模态影像组学文献分享:多模态图注意力网络用于COVID-19预后预测

文献速递&#xff1a;多模态影像组学文献分享&#xff1a;多模态图注意力网络用于COVID-19预后预测 01 文献速递介绍 在处理像 COVID-19 这样的新出现的疾病时&#xff0c;患者和疾病特定因素&#xff08;例如&#xff0c;体重或已知共病&#xff09;对疾病的即时进展的影响…