当前位置: 首页 > news >正文

荆门建网站费用潍坊地区制作网站

荆门建网站费用,潍坊地区制作网站,wordpress 微信支付插件,阿里云网站建设详细教程文章目录 前言一、对 Java RestClient 的认识1.1 什么是 RestClient1.2 RestClient 核心类#xff1a;RestHighLevelClient 二、使用 Java RestClient 操作索引库2.1 根据数据库表编写创建 ES 索引的 DSL 语句2.2 初始化 Java RestClient2.2.1 在 Spring Boot 项目中引入 Rest… 文章目录 前言一、对 Java RestClient 的认识1.1 什么是 RestClient1.2 RestClient 核心类RestHighLevelClient 二、使用 Java RestClient 操作索引库2.1 根据数据库表编写创建 ES 索引的 DSL 语句2.2 初始化 Java RestClient2.2.1 在 Spring Boot 项目中引入 RestHighLevelClient 的依赖2.2.2 编写 HotelIndexTests 单元测试类完成 RestHighLevelClient 的初始化 2.3 创建索引库2.4 删除索引库2.5 判断索引库是否存在 三、使用 Java RestClient 实现对文档的增删改查3.1 新增文档3.2 获取文档3.3 更新文档3.4 删除文档3.5 批量导入文档 前言 ElasticSearch 官方提供了各种不同语言的客户端用来操作 ES。这些客户端的本质就是组装 DSL 语句通过 HTTP 请求发送给 ES 服务器。 官方文档地址https://www.elastic.co/guide/en/elasticsearch/client/index.html。 在本文中我们将着重介绍 ElasticSearch Java 客户端中的 RestClient并演示如何使用它实现对索引库和文档的各种操作。 一、对 Java RestClient 的认识 1.1 什么是 RestClient RestClient 是 ElasticSearch 提供的用于与 ElasticSearch 集群进行通信的 Java 客户端。它提供了一种简单而灵活的方式来执行 REST 请求并处理响应。通过 RestClient我们可以轻松地在 Java 中操作 ElasticSearch。 在 ES 官方文档中看到 Java 的 RestClient 分为 High level REST client 和 Low level REST client 它们之间的区别 High Level REST Client 面向对象提供了更加面向对象的API简化了复杂的操作使用起来更加方便。使用场景适用于绝大多数的操作特别是对于复杂的操作比如查询、索引、更新等。 Low Level REST Client 更接近 HTTP 层提供的是与 Elasticsearch REST API 一一对应的方法更加灵活适用于特定场景的定制化需求。使用场景适用于对于 Elasticsearch 提供的 REST API 进行细粒度控制的情况比如处理特殊的请求和响应。 1.2 RestClient 核心类RestHighLevelClient RestHighLevelClient 是 Elasticsearch Java 客户端中的高级客户端提供了更加方便和抽象的操作方式适用于大多数的 Elasticsearch 操作。在使用 RestHighLevelClient 之前需要创建一个 RestClient 实例并将其包装在 RestHighLevelClient 中。 主要功能和特点 面向对象的操作RestHighLevelClient 提供了更加面向对象的 API使得 Elasticsearch 操作更加符合 Java 开发的习惯易于理解和使用。 内置序列化和反序列化RestHighLevelClient 内置了 Jackson 库可以自动序列化和反序列化 Elasticsearch 的请求和响应无需手动处理 JSON 数据。 复杂查询支持支持复杂的 Elasticsearch 查询操作如布尔查询、范围查询、聚合查询等。 错误处理提供了异常处理机制能够更好地捕获和处理 Elasticsearch 操作中的错误。 并发性RestHighLevelClient 可以处理多个并发请求是多线程安全的。 常用操作和方法 以下是 RestHighLevelClient 类的一些常用操作和方法通过这些方法可以实现对 Elasticsearch 的索引库和文档的各种操作 操作方法描述索引文档IndexResponse index(IndexRequest request, RequestOptions options)向指定索引插入文档获取文档GetResponse get(GetRequest request, RequestOptions options)根据文档 ID 获取文档删除文档DeleteResponse delete(DeleteRequest request, RequestOptions options)根据文档 ID 删除文档更新文档UpdateResponse update(UpdateRequest request, RequestOptions options)根据文档 ID 更新文档批量操作BulkResponse bulk(BulkRequest request, RequestOptions options)批量执行操作查询SearchResponse search(SearchRequest request, RequestOptions options)执行搜索查询聚合查询SearchResponse search(SearchRequest request, RequestOptions options)执行聚合查询清理滚动ClearScrollResponse clearScroll(ClearScrollRequest request, RequestOptions options)清理滚动上下文 以上只是 RestHighLevelClient 类的一部分方法更多详细的操作和方法请参考 官方文档。这些方法提供了丰富的功能可以满足各种 Elasticsearch 操作的需求。 二、使用 Java RestClient 操作索引库 2.1 根据数据库表编写创建 ES 索引的 DSL 语句 当需要将已有的数据库数据导入到 Elasticsearch 索引中时首先需要定义好 Elasticsearch 索引的 mapping 结构这样 Elasticsearch 才能正确解析和存储数据。 在这个例子中我们有一个名为 hotel 的数据库表它有各种不同类型的字段包括文本、数字、地理坐标等。让我们逐步解释如何根据数据库表的结构编写创建 Elasticsearch 索引的 DSLDomain Specific Language语句。 数据库表结构分析 首先让我们来看一下 hotel 表的结构 ---------------------------------------------------- | Field | Type | Null | Key | Default | Extra | ---------------------------------------------------- | id | bigint | NO | PRI | NULL | | | name | varchar(255) | NO | | NULL | | | address | varchar(255) | NO | | NULL | | | price | int | NO | | NULL | | | score | int | NO | | NULL | | | brand | varchar(32) | NO | | NULL | | | city | varchar(32) | NO | | NULL | | | star_name | varchar(16) | YES | | NULL | | | business | varchar(255) | YES | | NULL | | | latitude | varchar(32) | NO | | NULL | | | longitude | varchar(32) | NO | | NULL | | | pic | varchar(255) | YES | | NULL | | ----------------------------------------------------这个表包含了以下字段 id长整型bigintname文本字符串varchar用于存储酒店名称address文本字符串用于存储酒店地址price整数int表示酒店价格score整数表示酒店评分brand文本字符串用于存储酒店品牌city文本字符串用于存储城市名称star_name文本字符串用于存储星级名称可为空business文本字符串用于存储营业信息可为空latitude文本字符串用于存储纬度坐标longitude文本字符串用于存储经度坐标pic文本字符串用于存储图片路径可为空 创建 Elasticsearch 索引的 DSL 现在让我们将上述数据库表的结构映射到 Elasticsearch 索引的 DSL 中 PUT /hotel {mappings: {properties: {id: {type: long},name: {type: text,analyzer: ik_max_word,copy_to: all},address: {type: keyword,index: false},price: {type: integer},score: {type: integer},brand: {type: keyword,copy_to: all},city: {type: keyword},starName: {type: keyword},business: {type: keyword,copy_to: all},location: {type: geo_point},pic: {type: keyword,index: false},all: {type: text,analyzer: ik_max_word}}} }重要说明 地理坐标 (location) 字段 在 MySQL 数据库表中地理坐标是使用 latitude 和 longitude 两个字段表示的。但在 Elasticsearch 中我们使用 geo_point 类型来表示地理坐标。 geo_point由纬度latitude和经度longitude确定的一个点。例如“32.8752345, 120.2981576”。 补充ES 中支持两种地理坐标数据类型 geo_point由纬度latitude和经度longitude确定的一个点。例如32.8752345, 120.2981576。geo_shape有多个geo_point组成的复杂几何图形。例如一条直线LINESTRING (-77.03653 38.897676, -77.009051 38.889939)。 字段拷贝 字段拷贝的目的是在搜索时同时匹配多个字段。我们使用 copy_to 属性将当前字段拷贝到指定字段。这样在搜索时可以同时匹配 name、brand 和 business 字段。 示例 all: {type: text,analyzer: ik_max_word }, brand: {type: keyword,copy_to: all }映射规则总结 Elasticsearch 对不同类型的字段有不同的映射规则以下是常见类型的映射规则 字符串 (text 和 keyword) text 用于全文搜索支持分词keyword 用于精确匹配不分词。整数 (integer) 用于存储整数。长整型 (long) 用于存储长整数。浮点数 (float) 用于存储浮点数。地理坐标 (geo_point) 用于存储地理坐标。日期 (date) 用于存储日期时间。 通过正确定义索引的映射规则我们可以更有效地利用 Elasticsearch 的搜索和分析功能。 2.2 初始化 Java RestClient 2.2.1 在 Spring Boot 项目中引入 RestHighLevelClient 的依赖 首先在 pom.xml 中引入依赖 !--ElasticSearch 客户端依赖-- dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactIdversion7.12.1/version /dependency此次引入的版本是 7.12.1 版本的目的是与ElasticSearch 服务器的版本相同。刷新 Maven 之后发现 elasticsearch-rest-high-level-client依赖中某些组件的版本并不是7.12.1的 其原因是 Spring Boot 已经自动为我们管理了一些依赖其中就包括了elasticsearch其版本就是 7.6.2的。 因此我们需要做的就是在 pom.xml 覆盖这个配置即在 properties 中指定版本为 7.12.1 再次刷新 Maven就能够发现所有组件的版本都是 7.12.1 了 2.2.2 编写 HotelIndexTests 单元测试类完成 RestHighLevelClient 的初始化 SpringBootTest class HotelIndexTests {private RestHighLevelClient client;BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.248.128:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}/*** 测试初始化客户端*/Testvoid testInit() {System.out.println(client);} }对上述代码的说明 在上述代码中通过 RestClient.builder 构建了 RestHighLevelClient 实例并指定了 ElasticSearch 服务器的地址为 http://192.168.248.128:9200。这是一个简单的单元测试用于验证客户端的初始化是否成功。 在 BeforeEach 注解的方法中我们创建了 RestHighLevelClient 的实例而在 AfterEach 注解的方法中我们关闭了客户端。这是为了保证测试用例执行前后客户端都能够正确地被初始化和关闭。 在测试方法 testInit 中我们简单地打印了客户端对象以验证其初始化是否成功。 在接下来的内容中我们将继续使用编写单元测试方法执行一系列对 ElasticSearch 索引库和文档的操作。 2.3 创建索引库 创建 hotel 索引库会使用到前文根据 hotle 表结构编写的 DSL mapping 映射在Java代码中我们需要将其封装成一个全局常量例如将其保存到名为 MAPPING_TEMPLATE 的常量字符串中 public class HotelConstants {public static final String MAPPING_TEMPLATE {\n \mappings\: {\n \properties\: {\n \id\: {\n \type\: \long\\n },\n \name\: {\n \type\: \text\,\n \analyzer\: \ik_max_word\,\n \copy_to\: \all\\n },\n \address\: {\n \type\: \keyword\,\n \index\: false\n },\n \price\: {\n \type\: \integer\\n },\n \score\: {\n \type\: \integer\\n },\n \brand\: {\n \type\: \keyword\,\n \copy_to\: \all\\n },\n \city\: {\n \type\: \keyword\\n },\n \starName\: {\n \type\: \keyword\\n },\n \business\: {\n \type\: \keyword\,\n \copy_to\: \all\\n },\n \location\: {\n \type\: \geo_point\\n },\n \pic\: {\n \type\: \keyword\,\n \index\: false\n },\n \all\: {\n \type\: \text\,\n \analyzer\: \ik_max_word\\n }\n }\n }\n }; } 下面是创建索引库的单元测试方 /*** 创建索引库** throws IOException 抛出异常*/Testvoid testCreateHotelIndex() throws IOException {// 1. 创建 Request 对象CreateIndexRequest request new CreateIndexRequest(hotel);// 2. 准备请求参数DSL 语句request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3. 发起请求client.indices().create(request, RequestOptions.DEFAULT);}对上述代码的说明 创建 CreateIndexRequest 对象指定索引库的名称为 hotel。准备请求参数即 DSL 语句使用 MAPPING_TEMPLATE 常量。发起创建索引库的请求通过 client.indices().create(request, RequestOptions.DEFAULT) 执行。 这样我们就完成了通过 Java RestClient 创建 ElasticSearch 索引库的操作。在实际应用中创建索引库是一个初始化工作通常在应用启动时执行一次即可。 2.4 删除索引库 以下是使用 Java RestClient 删除名为 “hotel” 的索引库的单元测试方法 /*** 删除索引库* throws IOException 抛出异常*/ Test void testDeleteHotelIndex() throws IOException {// 1. 创建 Request 对象DeleteIndexRequest request new DeleteIndexRequest(hotel);// 2. 发起请求client.indices().delete(request, RequestOptions.DEFAULT); }对上述代码的说明 创建 DeleteIndexRequest 对象指定要删除的索引库名称为 “hotel”。发起删除索引库的请求通过 client.indices().delete(request, RequestOptions.DEFAULT) 执行。 这个方法主要用于清理测试环境或者在应用退出时执行以确保数据的整洁和安全。 删除索引库的操作需要谨慎执行因为它会将整个索引库以及其中的所有文档都删除且无法恢复。在实际应用中通常会设置一些安全机制来避免误操作。 2.5 判断索引库是否存在 在 Elasticsearch 中我们可以通过 Java RestClient 来判断指定的索引库是否存在。以下是一个示例代码 Test void testExistsHotelIndex() throws IOException {// 1. 创建 GetIndexRequest 对象指定要判断是否存在的索引库名称为 hotelGetIndexRequest request new GetIndexRequest(hotel);// 2. 发起请求执行判断索引库是否存在的操作boolean exists client.indices().exists(request, RequestOptions.DEFAULT);// 3. 打印判断结果System.out.println(exists ? 索引库存在 : 索引库不存在); }在这个方法中首先创建了一个 GetIndexRequest 对象指定了要判断是否存在的索引库名称为 “hotel”。然后通过 client.indices().exists(request, RequestOptions.DEFAULT) 发起请求执行判断索引库是否存在的操作。最后根据返回的布尔值输出相应的提示信息。 这个方法通常用于在进行其他操作之前先判断索引库是否存在以确保我们不会对不存在的索引库执行其他操作。 三、使用 Java RestClient 实现对文档的增删改查 3.1 新增文档 在新增文档之前首先需要从数据库中去查询一条记录然后再将查询到的记录保存到 ES 文档中。例如现在有一条 id61083的酒店数据我们需要把它查询出来然后添加到文档中 首先同样需要创建一个测试类HotelDocumentTests并完成 RestHighLevelClient 的初始化。然后新增文档的测试代码如下 Test void testAddDocument() throws IOException {// 根据id查询酒店Hotel hotel hotelService.getById(61083L);// 转换为文档类型HotelDoc hotelDoc new HotelDoc(hotel);// 1. 准备 Request 对象IndexRequest request new IndexRequest(hotel).id(hotel.getId().toString());// 2. 准备 JSON 文档request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);// 3. 发送请求client.index(request, RequestOptions.DEFAULT); }对上述代码的说明 根据 ID 查询酒店数据 使用 hotelService.getById(61083L) 方法从数据库中根据酒店 ID这里是 61083L查询酒店数据并封装到 Hotel 对象中。 转换为文档类型 将查询到的 Hotel 类型转换为HotelDoc文档类型因为数据库和文档中表示经纬度的方式不同。 准备 IndexRequest 对象 创建 IndexRequest 对象指定索引库名称为 “hotel”并设置文档 ID 为酒店的 ID使用 hotel.getId().toString() 获取 ID 的字符串表示。 准备 JSON 文档 将 HotelDoc 对象转换为 JSON 格式的字符串使用 JSON.toJSONString(hotelDoc) 实现转换。 发送请求 使用 client.index(request, RequestOptions.DEFAULT) 发送请求将准备好的文档添加到索引库中。 这个测试方法演示了如何通过 Java RestClient 向 Elasticsearch 索引库中新增文档。 3.2 获取文档 获取指定文档的测试方法的代码如下 Test void testGetDocument() throws IOException {// 1. 创建 Request 对象GetRequest request new GetRequest(hotel, 61083);// 2. 发送请求获取结果GetResponse response client.get(request, RequestOptions.DEFAULT);// 3. 解析结果String json response.getSourceAsString();// 4. 将字符串解析为 HotelDoc 对象HotelDoc hotelDoc JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc); }对该方法的详细说明 创建 GetRequest 对象 使用 GetRequest 对象指定索引库名称为 “hotel”文档 ID 为 “61083”。 发送请求获取结果 使用 client.get(request, RequestOptions.DEFAULT) 发送请求获取包含文档信息的 GetResponse 对象。 解析结果 通过 response.getSourceAsString() 获取文档内容的 JSON 字符串表示。 将字符串解析为 HotelDoc 对象 使用 JSON.parseObject(json, HotelDoc.class) 将获取的 JSON 字符串解析为 HotelDoc 对象。 这个测试方法演示了如何通过 Java RestClient 获取 Elasticsearch 索引库中指定文档的信息。 3.3 更新文档 更新文档的测试方法的代码如下 Test void testUpdateDocument() throws IOException {// 1. 获取 Request 对象UpdateRequest request new UpdateRequest(hotel, 61083);// 2. 准备参数request.doc(price, 1000,score, 50);// 3. 发起请求client.update(request, RequestOptions.DEFAULT); }对该方法的详细说明 获取 UpdateRequest 对象 使用 UpdateRequest 对象指定索引库名称为 “hotel”文档 ID 为 “61083”。 准备参数 使用 request.doc(...) 方法准备需要更新的字段及其对应的新值。在这个例子中更新了 “price” 字段为 1000“score” 字段为 50。 发起请求 使用 client.update(request, RequestOptions.DEFAULT) 发送更新请求。 这个测试方法演示了如何通过 Java RestClient 更新 Elasticsearch 索引库中的指定文档。 3.4 删除文档 删除指定文档的单元测试方法的代码如下 Testvoid testDeleteDocument() throws IOException {// 1. 获取 Request 对象DeleteRequest request new DeleteRequest(hotel, 61083);// 2. 发起请求client.delete(request, RequestOptions.DEFAULT);}对该方法的详细说明 获取 DeleteRequest 对象 使用 DeleteRequest 对象指定索引库名称为 “hotel”文档 ID 为 “61083”。 发起请求 使用 client.delete(request, RequestOptions.DEFAULT) 发送删除请求。 这个测试方法演示了如何通过 Java RestClient 删除 Elasticsearch 索引库中的指定文档。 3.5 批量导入文档 在实际开发中我们不可能像上面那样一条数据一条数据的导入到文档中而是需要批量的查询数据库然后将结果集批量的导入到文档中导入批量数据到文档的测试方法如下 Test void testBulkRequest() throws IOException {// 批量查询酒店数据ListHotel hotels hotelService.list();// 1. 创建 BulkRequestBulkRequest request new BulkRequest();// 转换为文档类型 HotelDocfor (Hotel hotel : hotels) {HotelDoc hotelDoc new HotelDoc(hotel);// 2. 准备参数添加多个新增的 Requestrequest.add(new IndexRequest(hotel).id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON));}// 3. 发起请求client.bulk(request, RequestOptions.DEFAULT); } 对上述代码的说明 批量查询酒店数据 使用 hotelService.list() 批量获取酒店数据。 创建 BulkRequest 对象 使用 BulkRequest 对象准备批量请求。 循环添加请求 遍历酒店数据列表将每个酒店数据转换为 HotelDoc 类型并添加到 BulkRequest 中。 发起请求 使用 client.bulk(request, RequestOptions.DEFAULT) 发送批量请求。 这个测试方法演示了如何通过 Java RestClient 批量导入 Elasticsearch 索引库中的文档。批量导入通常能够提高效率特别是在处理大量数据时。
http://www.tj-hxxt.cn/news/137631.html

相关文章:

  • 河南省建设工程造价协会网站教资注册网址
  • 行业网站开发运营方案百度地图手机网站代码
  • 可以做网站的公司wordpress调用个人中心
  • 南召微网站建设写代码建商城网站时间
  • 淘宝做链接有哪些网站可以做装修公司网站模板下载
  • 预登记网站开发 会议金寨县建设局网站
  • 常德网络建站wordpress发布外网访问
  • 万网网站后台登陆网页界面设计的原则有哪些
  • 淘客导购网站怎么做做棋牌网站建设哪家便宜
  • 找外国女朋友的网站建设上杭网页制作
  • 专业网络建站公司太原市城市建设规划局官方网站
  • 网站建设模板软件企业网站策划实训
  • 做个兼职网站设计手机兼职软件推荐app
  • 如何在本地发布自己做的网站对于网站运营应该如何做
  • 重庆营销网站制作徐州网站建设模板
  • 聊城做手机网站福州商城网站开发公司
  • 做网站首页布局设计注意事项眉山建设局网站
  • 简单手机网站模板四川建设招标网站首页
  • 企业网站的建设目的有什么网站制作怎么做语音搜索框
  • 网站建设费用估计Wordpress pay plugin
  • 实用网站开发怎样才能做好销售
  • 网站改版 升级的目的是什么沧州南皮手机网站建设
  • 河北seo网站设计网约车后台平台网站建设
  • 网站建设属于软件技术就业前景怎么样
  • 北京经济技术开发区建设局网站跨境电商商城源码
  • 惠州住房和城乡建设部网站安丘市住房和城乡建设局网站
  • 网站做优化现在公众号做电影网站的发展
  • 有教做鱼骨图的网站吗wordpress会员微信支付宝
  • 数字营销名词解释门户网站怎么做seo
  • 网站建站免费如何做网站流量分析报表