怎么自己制作网站平台产看网站权重
news/
2025/10/4 2:32:10/
文章来源:
怎么自己制作网站平台,产看网站权重,wordpress怎么发布文章带图片,行政单位门户网站建设方案1. RestClient
ES官方提供了各种不同语言的客户端#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句#xff0c;通过http请求发送给ES。官方文档地址#xff1a;Elasticsearch Clients | Elastic
其中的Java Rest Client又包括两种#xff1a; Java Low Level Res…1. RestClient
ES官方提供了各种不同语言的客户端用来操作ES。这些客户端的本质就是组装DSL语句通过http请求发送给ES。官方文档地址Elasticsearch Clients | Elastic
其中的Java Rest Client又包括两种 Java Low Level Rest Client Java High Level Rest Client
1.1.创建一个项目
项目结构如下 1.2. mapping映射
创建索引库最关键的是mapping映射而mapping映射要考虑的信息包括 字段名 字段数据类型 是否参与搜索 是否需要分词 如果分词分词器是什么
其中 字段名、字段数据类型可以参考数据表结构的名称和类型 是否参与搜索要分析业务来判断例如图片地址就无需参与搜索 是否分词呢要看内容内容如果是一个整体就无需分词反之则要分词 分词器我们可以统一使用ik_max_word
来看下酒店数据的索引库结构:
PUT /hotel
{mappings: {properties: {id: {type: keyword},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,copy_to: all},starName:{type: keyword},business:{type: keyword},location:{type: geo_point},pic:{type: keyword,index: false},all:{type: text,analyzer: ik_max_word}}}
}
几个特殊字段说明 location地理坐标里面包含精度、纬度 all一个组合字段其目的是将多字段的值 利用copy_to合并提供给用户搜索
地理坐标说明 copy_to说明 1.3. 初始化RestClient
在elasticsearch提供的API中与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中必须先完成这个对象的初始化建立与elasticsearch的连接。
分为三步
1.3.1. 引入es的RestHighLevelClient依赖
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactId
/dependency
1.3.2. 因为SpringBoot默认的ES版本是7.6.2所以我们需要覆盖默认的ES版本
propertiesjava.version1.8/java.versionelasticsearch.version7.12.1/elasticsearch.version
/properties
1.3.3. 初始化RestHgihLevelClient:
代码如下
public class HotelIndexTest {private RestHighLevelClient client;BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.150.101:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}
2. RestClient操作索引
2.1. 创建索引库
创建索引库的API如下 代码分为三步 1创建Request对象。因为是创建索引库的操作因此Request是CreateIndexRequest。 2添加请求参数其实就是DSL的JSON参数部分。因为json字符串很长这里是定义了静态字符串常量MAPPING_TEMPLATE让代码看起来更加优雅。 3发送请求client.indices()方法的返回值是IndicesClient类型封装了所有与索引库操作有关的方法。
完整示例
在hotel-demo的cn.itcast.hotel.constants包下创建一个类定义mapping映射的JSON字符串常量
public class HotelConstants {public static final String MAPPING_TEMPLATE {\n \mappings\: {\n \properties\: {\n \id\: {\n \type\: \keyword\\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 \copy_to\: \all\\n },\n \starName\:{\n \type\: \keyword\\n },\n \business\:{\n \type\: \keyword\\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 };
}
在hotel-demo中的HotelIndexTest测试类中编写单元测试实现创建索引
Test
void 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);
}
2.2. 删除索引库
删除索引库的DSL语句非常简单
xxxxxxxxxx DELETE /hotel
与创建索引库相比 请求方式从PUT变为DELTE 请求路径不变 无请求参数
所以代码的差异注意体现在Request对象上。依然是三步走 1创建Request对象。这次是DeleteIndexRequest对象 2准备参数。这里是无参 3发送请求。改用delete方法
在hotel-demo中的HotelIndexTest测试类中编写单元测试实现删除索引
Test
void DeleteHotelIndex() throws IOException{//1.创建request对象DeleteIndexRequest request new DeleteIndexRequest(hotel);//2.发送请求client.indices().delete(request,RequestOptions.DEFAULT);
}
2.3. 判断索引库是否存在
本质就是查询对应的DSL语句是
GET /hotel
因此与删除的Java代码流程是类似的。依然是三步走 1创建Request对象。这次是GetIndexRequest对象 2准备参数。这里是无参 3发送请求。改用exists方法
Test
void testExistsIndex() throws IOException{//1.创建request对象GetIndexRequest request new GetIndexRequest(hotel);//2.发起请求boolean exists client.indices().exists(request,RequestOptions.DEFAULT);//3.输出System.out.println(exists ? hotel索引存在 : hotel索引不存在);
}
2.4. 总结
JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。
索引库操作的基本步骤 初始化RestHighLevelClient 创建XxxIndexRequest。XXX是Create、Get、Delete 准备DSL Create时需要其它是无参 发送请求。调用RestHighLevelClient#indices().xxx()方法xxx是create、exists、delete
3. RestClient操作文档
3.1. 新增文档
我们要将数据库的酒店数据查询出来写入elasticsearch中。
3.1.1. 索引库实体类
数据库查询后的结果是一个Hotel类型的对象结构如下
Data
TableName(tb_hotel)
public class Hotel {TableId(type IdType.INPUT)private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String longitude;private String latitude;private String pic;
}
与我们的索引库结构存在差异 longitude和latitude需要合并为location
因此我们需要定义一个新的类型与索引库结构吻合
Data
NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;public HotelDoc(Hotel hotel) {this.id hotel.getId();this.name hotel.getName();this.address hotel.getAddress();this.price hotel.getPrice();this.score hotel.getScore();this.brand hotel.getBrand();this.city hotel.getCity();this.starName hotel.getStarName();this.business hotel.getBusiness();this.location hotel.getLatitude() , hotel.getLongitude();this.pic hotel.getPic();}
}
3.1.2. 语法说明
新增文档的DSL语句如下
POST /{索引库名}/_doc/1
{name: Jack,age: 21
}
对应的java代码如图 可以看到与创建索引库类似同样是三步走 1创建Request对象 2准备请求参数也就是DSL中的JSON文档 3发送请求
变化的地方在于这里直接使用client.xxx()的API不再需要client.indices()了。
3.1.3. 完整代码
我们导入酒店数据基本流程一致但是需要考虑几点变化 酒店数据来自于数据库我们需要先查询出来得到hotel对象 hotel对象需要转为HotelDoc对象 HotelDoc需要序列化为json格式
因此代码整体步骤如下 1根据id查询酒店数据Hotel 2将Hotel封装为HotelDoc 3将HotelDoc序列化为JSON 4创建IndexRequest指定索引库名和id 5准备请求参数也就是JSON文档 6发送请求
在hotel-demo的HotelDocumentTest测试类中编写单元测试
Test
void testAddDocument() throws IOException{//1.根据id查询酒店数据Hotel hotel hotelservice.getById(61803L);//2.把Hotel类型的转成HotelDoc类型HotelDoc hoteldoc new HotelDoc(hotel);//3.将HotelDoc转为jsonString json JSON.toJSONString(hotelDoc);//1.准备request对象IndexRequest request new IndexRequest(hotel).id(hotelDoc.getId().toString());//2.准备JSON文档request.source(json,XContentType.JSON);//3.发送请求client.index(request,RequestOptions.DEFAULT);
}
3.2. 查询文档
3.2.1. 语法说明
查询的DSL语句如下
GET /hotel/_doc/{id}
非常简单因此代码大概分两步 准备Request对象 发送请求
不过查询的目的是得到结果解析为HotelDoc因此难点是结果的解析。完整代码如下 可以看到结果是一个JSON其中文档放在一个_source属性中因此解析就是拿到_source反序列化为Java对象即可。
与之前类似也是三步走 1准备Request对象。这次是查询所以是GetRequest 2发送请求得到结果。因为是查询这里调用client.get()方法 3解析结果就是对JSON做反序列化
3.2.2 完整代码
在hotel-demo的HotelDocumentTest测试类中编写单元测试
Test
void testGetDocument() throws IOException{//1.创建request对象GetRequest request new GetRequest(hotel,61803);//2.发送请求得到响应GetResponse response client.get(request,RequestOptions.DEFAULT);//3.解析响应结果String json response.getSourceAsString();HotelDoc hotelDoc JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);
}
3.3. 删除文档
删除的DSL为是这样的
DELETE /hotel/_doc/{id}
与查询相比仅仅是请求方式从DELETE变成GET可以想象Java代码应该依然是三步走 1准备Request对象因为是删除这次是DeleteRequest对象。要指定索引库名和id 2准备参数无参 3发送请求。因为是删除所以是client.delete()方法
在hotel-demo的HotelDocumentTest测试类中编写单元测试
Test
void testDeleteDocument() throws IOException {// 1.准备RequestDeleteRequest request new DeleteRequest(hotel, 61083);// 2.发送请求client.delete(request, RequestOptions.DEFAULT);
}
3.4. 修改文档
3.4.1. 语法说明
修改文档有两种方式
1.全量修改本质是根据id删除然后进行新增
2.增量修改修改文档中指定的字段的值
在RestClient的API中全量修改与新增的API完全一致判断依据是ID 如果新增时ID已经存在则修改 如果新增时ID不存在则新增
这里不再赘述我们主要关注增量修改。
代码示例如图 与之前类似也是三步走 1准备Request对象。这次是修改所以是UpdateRequest 2准备参数。也就是JSON文档里面包含要修改的字段 3更新文档。这里调用client.update()方法
3.4.2. 完整代码
在hotel-demo的HotelDocumentTest测试类中编写单元测试
Test
void testUpdateDocument() throws IOException{//1.准备requestUpdateRequest request new UpdateRequest(hotel,61083);//2.准备参数request.doc(price,699,starName, 四钻);//3.发起请求client.update(request,RequestOptions.DEFAULT);
}
3.5. 批量导入文档
案例需求利用BulkRequest批量将数据库数据导入到索引库中。
步骤如下 利用mybatis-plus查询酒店数据 将查询到的酒店数据Hotel转换为文档类型数据HotelDoc 利用JavaRestClient中的BulkRequest批处理实现批量新增文档
3.5.1.语法说明
批量处理BulkRequest其本质就是将多个普通的CRUD请求组合在一起发送。
其中提供了一个add方法用来添加其他请求 可以看到能添加的请求包括 IndexRequest也就是新增 UpdateRequest也就是修改 DeleteRequest也就是删除
因此Bulk中添加了多个IndexRequest就是批量新增功能了。示例 其实还是三步走 1创建Request对象。这里是BulkRequest 2准备参数。批处理的参数就是其它Request对象这里就是多个IndexRequest 3发起请求。这里是批处理调用的方法为client.bulk()方法
我们在导入酒店数据时将上述代码改造成for循环处理即可。
3.5.2. 完整代码
在hotel-demo的HotelDocumentTest测试类中编写单元测试
Test
void testBulkRequest() throws IOException{//批量查询数据ListHotel hotels hotelservice.list();//1.创建requestBulkRequest request new BulkRequest();//2.准备参数添加多个新增的requestfor(Hotel hotel : hotels){//2.1 转换为HotelDoc文档类型HotelDoc hotelDoc new HotelDoc(hotel);//2.2 创建新增文档的Request对象request.add(new IndexRequest(hotel).id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON);
}//3.发起请求client.bulk(request,RequestOptions.DEFAULT);
}
3.6. 小结
文档操作的基本步骤 初始化RestHighLevelClient 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk 准备参数Index、Update、Bulk时需要 发送请求。调用RestHighLevelClient#.xxx()方法xxx是index、get、update、delete、bulk 解析结果Get时需要
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/926529.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!