帮别人做网站市场价,网站开发与建设课程设计,黄石建设网站公司,代码生成器app下载文章目录 前言一、客户端API二、API操作索引库1. mapping映射分析2.初始化RestClient3. 索引库CRUD3.1 创建索引库3.2 删除索引库3.3 查询索引库 三、API操作文档1. 初始化RestClient2. 文档CRUD2.0 批量导入文档2.1 批量新增文档2.2 查询文档2.3 批量删除文档2.4 批量修改文档…文章目录前言一、客户端API二、API操作索引库1. mapping映射分析2.初始化RestClient3. 索引库CRUD3.1 创建索引库3.2 删除索引库3.3 查询索引库三、API操作文档1. 初始化RestClient2. 文档CRUD2.0 批量导入文档2.1 批量新增文档2.2 查询文档2.3 批量删除文档2.4 批量修改文档前言RestAPIES官方提供了各种不同语言的客户端用来操作ES。这些客户端的本质就是组装DSL语句通过http请求发送给ES。一、客户端APIES官方提供了各种不同语言的客户端用来操作ES。这些客户端的本质就是组装DSL语句通过http请求发送给ES。官方文档地址https://www.elastic.co/guide/en/Elasticsearch/client/index.html其中的Java Rest Client又包括两种Java Low Level Rest ClientJava High Level Rest Client我们使用的是Java HighLevel Rest Client客户端API二、API操作索引库JavaRestClient操作Elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。索引库操作的基本步骤【可以根据发送请求那步的第一个参数发过来判断需要创建什么XXXXRequest】初始化RestHighLevelClient创建XxxIndexRequest。XXX是Create、Get、Delete准备DSL Create时需要其它是无参发送请求。调用RestHighLevelClient#indices().xxx()方法xxx是create、exists、delete1. mapping映射分析根据MySQL数据库表结构建表语句去写索引库结构JSON。表和索引库一一对应注意地理坐标、组合字段。索引库里的地理坐标是一个字段坐标维度,精度。copy_to组合字段作用是供用户查询输入关键字可以查询多个字段创建索引库最关键的是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说明2.初始化RestClient在Elasticsearch提供的API中与Elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中必须先完成这个对象的初始化建立与Elasticsearch的连接。分为三步1引入es的RestHighLevelClient依赖dependencygroupIdorg.Elasticsearch.client/groupIdartifactIdElasticsearch-rest-high-level-client/artifactId/dependency2因为SpringBoot默认的ES版本是7.6.2所以我们需要覆盖默认的ES版本propertiesjava.version1.8/java.versionElasticsearch.version7.12.1/Elasticsearch.version/properties3初始化RestHighLevelClient这里一般在启动类或者配置类里注入该Bean用于告诉Java 访问ES的ip地址初始化的代码如下BeanpublicRestHighLevelClientclient(){returnnewRestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.150.101:9200)));}这里为了单元测试方便我们创建一个测试类HotelIndexTest然后将初始化的代码编写在BeforeEach方法中packagecn.itcast.hotel;importorg.apache.http.HttpHost;importorg.Elasticsearch.client.RestHighLevelClient;importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importjava.io.IOException;publicclassHotelIndexTest{privateRestHighLevelClientclient;BeforeEachvoidsetUp(){this.clientnewRestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.150.101:9200)));}AfterEachvoidtearDown()throwsIOException{this.client.close();}}3. 索引库CRUD3.1 创建索引库代码分为三步1创建Request对象。因为是创建索引库的操作因此Request是CreateIndexRequest。2添加请求参数其实就是DSL的JSON参数部分。因为json字符串很长这里是定义了静态字符串常量MAPPING_TEMPLATE让代码看起来更加优雅。3发送请求client.indices()方法的返回值是IndicesClient类型封装了所有与索引库操作有关的方法。创建索引库的API如下代码在hotel-demo的cn.itcast.hotel.constants包下创建一个类定义mapping映射的JSON字符串常量packagecn.itcast.hotel.constants;publicclassHotelConstants{publicstaticfinalStringMAPPING_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测试类中编写单元测试实现创建索引TestvoidcreateHotelIndex()throwsIOException{// 1.创建Request对象CreateIndexRequestrequestnewCreateIndexRequest(hotel);// 2.准备请求的参数DSL语句request.source(MAPPING_TEMPLATE,XContentType.JSON);// 3.发送请求client.indices().create(request,RequestOptions.DEFAULT);}3.2 删除索引库三步走1创建Request对象。这次是DeleteIndexRequest对象2准备参数。这里是无参3发送请求。改用delete方法删除索引库的DSL语句非常简单DELETE/hotel在hotel-demo中的HotelIndexTest测试类中编写单元测试实现删除索引TestvoidtestDeleteHotelIndex()throwsIOException{// 1.创建Request对象DeleteIndexRequestrequestnewDeleteIndexRequest(hotel);// 2.发送请求client.indices().delete(request,RequestOptions.DEFAULT);}3.3 查询索引库三步走1创建Request对象。这次是GetIndexRequest对象2准备参数。这里是无参3发送请求。改用exists方法判断索引库是否存在本质就是查询对应的DSL是GET/hotelTestvoidtestExistsHotelIndex()throwsIOException{// 1.创建Request对象GetIndexRequestrequestnewGetIndexRequest(hotel);// 2.发送请求booleanexistsclient.indices().exists(request,RequestOptions.DEFAULT);// 3.输出System.err.println(exists?索引库已经存在:索引库不存在);}三、API操作文档这里更多的是先读取Mysql中的数据然后再存进ES中。文档操作的基本步骤【可以根据发送请求那步的第一个参数发过来判断需要创建什么XXXXRequest】初始化RestHighLevelClient创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk准备参数Index、Update、Bulk时需要发送请求。调用RestHighLevelClient#.xxx()方法xxx是index、get、update、delete、bulk解析结果Get时需要1. 初始化RestClient在Elasticsearch提供的API中与Elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中必须先完成这个对象的初始化建立与Elasticsearch的连接。分为三步1引入es的RestHighLevelClient依赖dependencygroupIdorg.Elasticsearch.client/groupIdartifactIdElasticsearch-rest-high-level-client/artifactId/dependency2因为SpringBoot默认的ES版本是7.6.2所以我们需要覆盖默认的ES版本propertiesjava.version1.8/java.versionElasticsearch.version7.12.1/Elasticsearch.version/properties3初始化RestHighLevelClient这里一般写在最前面用于告诉Java 访问ES的ip地址初始化的代码如下RestHighLevelClientclientnewRestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.150.101:9200)));这里为了单元测试方便我们创建一个测试类HotelIndexTest然后将初始化的代码编写在BeforeEach方法中packagecn.itcast.hotel;importorg.apache.http.HttpHost;importorg.Elasticsearch.client.RestHighLevelClient;importorg.junit.jupiter.api.AfterEach;importorg.junit.jupiter.api.BeforeEach;importorg.junit.jupiter.api.Test;importjava.io.IOException;publicclassHotelIndexTest{privateRestHighLevelClientclient;BeforeEachvoidsetUp(){this.clientnewRestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.150.101:9200)));}AfterEachvoidtearDown()throwsIOException{this.client.close();}}2. 文档CRUD2.0 批量导入文档三步走1创建Request对象。这里是BulkRequest2准备参数。批处理的参数就是其它Request对象这里就是多个IndexRequest3发起请求。这里是批处理调用的方法为client.bulk()方法案例需求利用BulkRequest批量将数据库数据导入到索引库中。步骤如下利用mybatis-plus查询酒店数据将查询到的酒店数据Hotel转换为文档类型数据HotelDoc利用JavaRestClient中的BulkRequest批处理实现批量新增文档语法说明批量处理BulkRequest其本质就是将多个普通的CRUD请求组合在一起发送。其中提供了一个add方法用来添加其他请求可以看到能添加的请求包括IndexRequest也就是新增UpdateRequest也就是修改DeleteRequest也就是删除因此Bulk中添加了多个IndexRequest就是批量新增功能了。示例我们在导入酒店数据时将上述代码改造成for循环处理即可。在hotel-demo的HotelDocumentTest测试类中编写单元测试TestvoidtestBulkRequest()throwsIOException{// 批量查询酒店数据ListHotelhotelshotelService.list();// 1.创建RequestBulkRequestrequestnewBulkRequest();// 2.准备参数添加多个新增的Requestfor(Hotelhotel:hotels){// 2.1.转换为文档类型HotelDocHotelDochotelDocnewHotelDoc(hotel);// 2.2.创建新增文档的Request对象request.add(newIndexRequest(hotel).id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));}// 3.发送请求client.bulk(request,RequestOptions.DEFAULT);}2.1 批量新增文档四步走0创建索引库实体类1创建Request对象2准备请求参数也就是DSL中的JSON文档3发送请求 注意这里直接使用client.xxx()的API不再需要client.indices()了我们要将数据库的酒店数据查询出来写入Elasticsearch中。1创建索引库实体类一般实体类里包含经纬度都需要创建一个新的实体类将经纬度拼成一个字段数据库查询后的结果是一个Hotel类型的对象。结构如下DataTableName(tb_hotel)publicclassHotel{TableId(typeIdType.INPUT)privateLongid;privateStringname;privateStringaddress;privateIntegerprice;privateIntegerscore;privateStringbrand;privateStringcity;privateStringstarName;privateStringbusiness;privateStringlongitude;privateStringlatitude;privateStringpic;}与我们的索引库结构存在差异longitude和latitude需要合并为location因此我们需要定义一个新的类型与索引库结构吻合packagecn.itcast.hotel.pojo;importlombok.Data;importlombok.NoArgsConstructor;DataNoArgsConstructorpublicclassHotelDoc{privateLongid;privateStringname;privateStringaddress;privateIntegerprice;privateIntegerscore;privateStringbrand;privateStringcity;privateStringstarName;privateStringbusiness;privateStringlocation;privateStringpic;publicHotelDoc(Hotelhotel){this.idhotel.getId();this.namehotel.getName();this.addresshotel.getAddress();this.pricehotel.getPrice();this.scorehotel.getScore();this.brandhotel.getBrand();this.cityhotel.getCity();this.starNamehotel.getStarName();this.businesshotel.getBusiness();this.locationhotel.getLatitude(), hotel.getLongitude();this.pichotel.getPic();}}2新增代码新增文档的DSL语句如下POST/{索引库名}/_doc/1{name:Jack,age:21}对应的java代码如图我们导入酒店数据基本流程一致但是需要考虑几点变化酒店数据来自于数据库我们需要先查询出来得到hotel对象hotel对象需要转为HotelDoc对象HotelDoc需要序列化为json格式在hotel-demo的HotelDocumentTest测试类中编写单元测试TestvoidtestAddDocument()throwsIOException{// 批量查询酒店数据ListHotelhotelshotelService.list();// 1.创建RequestBulkRequestrequestnewBulkRequest();// 2.准备参数添加多个新增的Requestfor(Hotelhotel:hotels){// 2.1.转换为文档类型HotelDocHotelDochotelDocnewHotelDoc(hotel);// 2.2.创建新增文档的Request对象request.add(newIndexRequest(hotel).id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));//实体类转JSON指定JSON格式request.add(newIndexRequest(xxx)...)}// 3.发送请求client.bulk(request,RequestOptions.DEFAULT);}2.2 查询文档查询文档是根据id查询的所以没有批量查询三步走1准备Request对象。这次是查询所以是GetRequest2发送请求得到结果。因为是查询这里调用client.get()方法3解析结果就是对JSON做反序列化查询的DSL语句如下GET/hotel/_doc/{id}非常简单因此代码大概分两步准备Request对象发送请求不过查询的目的是得到结果解析为HotelDoc因此难点是结果的解析。完整代码如下可以看到结果是一个JSON其中文档放在一个_source属性中因此解析就是拿到_source使用工具反序列化为Java对象即可。在hotel-demo的HotelDocumentTest测试类中编写单元测试TestvoidtestGetDocumentById()throwsIOException{// 1.准备RequestGetRequestrequestnewGetRequest(hotel,61082);// 2.发送请求得到响应GetResponseresponseclient.get(request,RequestOptions.DEFAULT);// 3.解析响应结果Stringjsonresponse.getSourceAsString();HotelDochotelDocJSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}2.3 批量删除文档三步走1准备Request对象因为是删除这次是DeleteRequest对象。要指定索引库名和id2准备参数无参3发送请求。因为是删除所以是client.delete()方法删除的DSL为是这样的DELETE/hotel/_doc/{id}在hotel-demo的HotelDocumentTest测试类中编写单元测试TestvoidtestDeleteDocument()throwsIOException{//0.查询数据库中的数据ListHotellisthotelService.list();// 1.创建RequestBulkRequestrequestnewBulkRequest();//2.批量转换实体类顺便写入到ES中for(Hotelhotel:list){//2.1转换实体类HotelDochotelDocnewHotelDoc(hotel);//2.2写入ESrequest.add(newDeleteRequest(hotel).id(hotel.getId().toString()));}//3.发送请求client.bulk(request,RequestOptions.DEFAULT);}2.4 批量修改文档三步走1准备Request对象。这次是修改所以是UpdateRequest2准备参数。也就是JSON文档里面包含要修改的字段3更新文档。这里调用client.update()方法修改有两种方式全量修改本质是先根据id删除再新增增量修改修改文档中的指定字段值在RestClient的API中全量修改与新增的API完全一致判断依据是ID如果新增时ID已经存在则修改如果新增时ID不存在则新增只演示增量修改代码示例如图在hotel-demo的HotelDocumentTest测试类中编写单元测试TestvoidtestUpdateDocument()throwsIOException{//0.查询数据库中的数据ListHotellisthotelService.list();// 1.创建RequestBulkRequestrequestnewBulkRequest();//2.批量转换实体类顺便写入到ES中for(Hotelhotel:list){//2.1转换实体类HotelDochotelDocnewHotelDoc(hotel);//2.2写入ESrequest.add(newUpdateRequest(hotel,hotel.getId().toString()).doc(price,952,starName,四钻));}//3.发送请求client.bulk(request,RequestOptions.DEFAULT);}本文的引用仅限自我学习如有侵权请联系作者删除。参考知识ElasticSearch (ES从入门到精通一篇就够了)ELK介绍