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

橄榄树网站建设长沙cms模板建站

橄榄树网站建设,长沙cms模板建站,汕头建网站,关于门户网站建设分布式搜索引擎ES 分布式搜索引擎ES1.elasticsearch概念1.1.ES起源1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch 1.4.1安装es、kibana、IK分词器1.4.2扩展词词典与停用词词典 2.索引库操作2.1.mappi… 分布式搜索引擎ES 分布式搜索引擎ES1.elasticsearch概念1.1.ES起源1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch 1.4.1安装es、kibana、IK分词器1.4.2扩展词词典与停用词词典 2.索引库操作2.1.mapping映射属性2.2.索引库的CRUD2.2.1.创建索引库和映射基本语法示例 2.2.2.查询索引库2.2.3.修改索引库2.2.4.删除索引库2.2.5.总结 3.文档操作3.1.新增文档3.2.查询文档3.3.删除文档3.4.修改文档3.4.1.全量修改3.4.2.增量修改 3.5.总结 4.RestAPI4.0.导入Demo工程4.0.1.导入数据4.0.2.导入项目4.0.3.mapping映射分析4.0.4.初始化RestClient 4.1.创建索引库4.1.1.代码解读4.1.2.完整示例 4.2.删除索引库4.3.判断索引库是否存在4.4.总结 5.RestClient操作文档5.1.新增文档5.1.1.索引库实体类5.1.2.语法说明5.1.3.完整代码 5.2.查询文档5.2.1.语法说明5.2.2.完整代码 5.3.删除文档5.4.修改文档5.4.1.语法说明5.4.2.完整代码 5.5.批量导入文档5.5.1.语法说明5.5.2.完整代码 5.6.小结 分布式搜索引擎ES – elasticsearch基础 1.elasticsearch概念 1.1.ES起源 elasticsearch结合kibana、Logstash、Beats也就是elastic stackELK。 elasticsearch底层是基于lucene来实现的。 Lucene是一个Java语言的搜索引擎类库是Apache公司的顶级项目由DougCutting于1999年研发。官网地址https://lucene.apache.org/ 。 elasticsearch的发展历史 2004年Shay Banon基于Lucene开发了Compass2010年Shay Banon 重写了Compass取名为Elasticsearch。 总结 什么是elasticsearch 一个开源的分布式搜索引擎可以用来实现搜索、日志统计、分析、系统监控等功能 什么是elastic stackELK 是以elasticsearch为核心的技术栈包括beats、Logstash、kibana、elasticsearch 什么是Lucene 是Apache的开源搜索引擎类库提供了搜索引擎的核心API 1.2.倒排索引 倒排索引的概念是基于MySQL这样的正向索引而言的。 1.2.1.正向索引 如果是根据id查询那么直接走索引查询速度非常快。 但如果是基于title做模糊查询只能是逐行扫描数据流程如下 1用户搜索数据条件是title符合%手机% 2逐行获取数据比如id为1的数据 3判断数据中的title是否符合用户搜索条件 4如果符合则放入结果集不符合则丢弃。回到步骤1 逐行扫描也就是全表扫描随着数据量增加其查询效率也会越来越低。当数据量达到数百万时就是一场灾难。 1.2.2.倒排索引 倒排索引中有两个非常重要的概念 文档Document用来搜索的数据其中的每一条数据就是一个文档。词条Term对文档数据或用户搜索数据利用某种算法分词得到的具备含义的词语就是词条。 创建倒排索引是对正向索引的一种特殊处理流程如下 将每一个文档的数据利用算法分词得到一个个词条创建表每行数据包括词条、词条所在文档id、位置等信息因为词条唯一性可以给词条创建索引例如hash表结构索引 倒排索引的搜索流程如下以搜索华为手机为例 1用户输入条件华为手机进行搜索。 2对用户输入内容分词得到词条华为、手机。 3拿着词条在倒排索引中查找可以得到包含词条的文档id1、2、3。 4拿着文档id到正向索引中查找具体文档。 如图 虽然要先查询倒排索引再查询倒排词条但是无论是词条、还是文档id都建立了索引查询速度非常快无需全表扫描。 正向索引是最传统的根据id索引的方式。但根据词条查询时必须先逐条获取每个文档然后判断文档中是否包含所需要的词条是根据文档找词条的过程。 倒排索引则相反是先找到用户要搜索的词条根据词条得到保护词条的文档的id然后根据id获取文档。是根据词条找文档的过程。 正向索引 优点 可以给多个字段创建索引根据索引字段搜索、排序速度非常快 缺点 根据非索引字段或者索引字段中的部分词条查找时只能全表扫描。 倒排索引 优点 根据词条搜索、模糊搜索时速度非常快 缺点 只能给词条创建索引而不是字段无法根据字段做排序 1.3.es的一些概念 elasticsearch中有很多独有的概念与mysql中略有差别但也有相似之处。 1.3.1.文档和字段 elasticsearch是面向文档Document存储的可以是数据库中的一条商品数据一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中而Json文档中往往包含很多的字段Field类似于数据库中的列。 1.3.2.索引和映射 索引Index就是相同类型的文档的集合。 例如 所有用户文档就可以组织在一起称为用户的索引所有商品的文档可以组织在一起称为商品的索引所有订单的文档可以组织在一起称为订单的索引 因此我们可以把索引当做是数据库中的表。 数据库的表会有约束信息用来定义表的结构、字段的名称、类型等信息。因此索引库中就有映射mapping是索引中文档的字段约束信息类似表的结构约束。 1.3.3.mysql与elasticsearch MySQLElasticsearch说明TableIndex索引(index)就是文档的集合类似数据库的表(table)RowDocument文档Document就是一条条的数据类似数据库中的行Row文档都是JSON格式ColumnField字段Field就是JSON文档中的字段类似数据库中的列ColumnSchemaMappingMapping映射是索引中文档的约束例如字段类型约束。类似数据库的表结构SchemaSQLDSLDSL是elasticsearch提供的JSON风格的请求语句用来操作elasticsearch实现CRUD Mysql擅长事务类型操作可以确保数据的安全和一致性 Elasticsearch擅长海量数据的搜索、分析、计算 因此在企业中往往是两者结合使用 对安全性要求较高的写操作使用mysql实现对查询性能要求较高的搜索需求使用elasticsearch实现两者再基于某种方式实现数据的同步保证一致性 1.4.1安装es、kibana、IK分词器 ik_smart智能切分粗粒度 eg程序员分成程序员 ik_max_word最细切分细粒度 eg程序员分成程序员程序员 测试代码(修改analyzer) GET /_analyze {analyzer: ik_max_word,text: 程序员 }1.4.2扩展词词典与停用词词典 词汇也需要不断的更新IK分词器提供了扩展词汇的功能。 IK分词器也提供了强大的停用词功能让我们在索引时就直接忽略当前的停用词汇表中的内容。 1打开IK分词器config目录 1IKAnalyzer.cfg.xml配置文件内容添加 ?xml version1.0 encodingUTF-8? !DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典--entry keyext_dictext.dic/entry!--用户可以在这里配置自己的扩展停止词字典 *** 添加停用词词典--entry keyext_stopwordsstopword.dic/entry /properties注意dic当前文件的编码必须是 UTF-8 格式严禁使用Windows记事本编辑 2.索引库操作 索引库就类似数据库表mapping映射就类似表的结构。 我们要向es中存储数据必须先创建“库”和“表”。 2.1.mapping映射属性 mapping是对索引库中文档的约束常见的mapping属性包括 type字段数据类型常见的简单类型有 字符串text可分词的文本、keyword精确值例如品牌、国家、ip地址数值long、integer、short、byte、double、float、布尔boolean日期date对象object index是否创建索引默认为trueanalyzer使用哪种分词器properties该字段的子字段 例如下面的json文档 {age: 21,weight: 52.1,isMarried: false,info: 程序员Java,email: zywww.cn,score: [99.1, 99.5, 98.9],name: {firstName: 云,lastName: 赵} }对应的每个字段映射mapping age类型为 integer参与搜索因此需要index为true无需分词器weight类型为float参与搜索因此需要index为true无需分词器isMarried类型为boolean参与搜索因此需要index为true无需分词器info类型为字符串需要分词因此是text参与搜索因此需要index为true分词器可以用ik_smartemail类型为字符串但是不需要分词因此是keyword不参与搜索因此需要index为false无需分词器score虽然是数组但是我们只看元素的类型类型为float参与搜索因此需要index为true无需分词器name类型为object需要定义多个子属性 name.firstName类型为字符串但是不需要分词因此是keyword参与搜索因此需要index为true无需分词器name.lastName类型为字符串但是不需要分词因此是keyword参与搜索因此需要index为true无需分词器 2.2.索引库的CRUD 这里我们统一使用Kibana编写DSL的方式来演示。 2.2.1.创建索引库和映射 基本语法 请求方式PUT请求路径/索引库名可以自定义请求参数mapping映射 格式 PUT /索引库名称 {mappings: {properties: {字段名:{type: text,analyzer: ik_smart},字段名2:{type: keyword,index: false},字段名3:{properties: {子字段: {type: keyword}}},// ...略}} }示例 PUT /heima {mappings: {properties: {info:{type: text,analyzer: ik_smart},email:{type: keyword,index: falsae},name:{properties: {firstName: {type: keyword}}},// ... 略}} }2.2.2.查询索引库 基本语法 请求方式GET 请求路径/索引库名 请求参数无 格式 GET /索引库名示例 2.2.3.修改索引库 倒排索引结构虽然不复杂但是一旦数据结构改变比如改变了分词器就需要重新创建倒排索引这简直是灾难。因此索引库一旦创建无法修改mapping。 虽然无法修改mapping中已有的字段但是却允许添加新的字段到mapping中因为不会对倒排索引产生影响。 语法说明 PUT /索引库名/_mapping {properties: {新字段名:{type: integer}} }示例 2.2.4.删除索引库 语法 请求方式DELETE 请求路径/索引库名 请求参数无 格式 DELETE /索引库名在kibana中测试 2.2.5.总结 索引库操作有哪些 创建索引库PUT /索引库名查询索引库GET /索引库名删除索引库DELETE /索引库名添加字段PUT /索引库名/_mapping 3.文档操作 3.1.新增文档 语法 POST /索引库名/_doc/文档id {字段1: 值1,字段2: 值2,字段3: {子属性1: 值3,子属性2: 值4},// ... }示例 POST /heima/_doc/1 {info: 程序员Java,email: zywww.cn,name: {firstName: 云,lastName: 赵} }响应 3.2.查询文档 根据rest风格新增是post查询应该是get不过查询一般都需要条件这里我们把文档id带上。 语法 GET /{索引库名称}/_doc/{id}通过kibana查看数据 GET /heima/_doc/1查看结果 3.3.删除文档 删除使用DELETE请求同样需要根据id进行删除 语法 DELETE /{索引库名}/_doc/id值示例 # 根据id删除数据 DELETE /heima/_doc/1结果 3.4.修改文档 修改有两种方式 全量修改直接覆盖原来的文档增量修改修改文档中的部分字段 3.4.1.全量修改 全量修改是覆盖原来的文档其本质是 根据指定的id删除文档新增一个相同id的文档 注意如果根据id删除时id不存在第二步的新增也会执行也就从修改变成了新增操作了。 语法 PUT /{索引库名}/_doc/文档id {字段1: 值1,字段2: 值2,// ... 略 } 示例 PUT /heima/_doc/1 {info: 程序员高级Java,email: zywww.cn,name: {firstName: 云,lastName: 赵} }3.4.2.增量修改 增量修改是只修改指定id匹配的文档中的部分字段。 语法 POST /{索引库名}/_update/文档id {doc: {字段名: 新的值,} }示例 POST /heima/_update/1 {doc: {email: ZhaoYunwww.cn} }3.5.总结 文档操作有哪些 创建文档POST /{索引库名}/_doc/文档id { json文档 }查询文档GET /{索引库名}/_doc/文档id删除文档DELETE /{索引库名}/_doc/文档id修改文档 全量修改PUT /{索引库名}/_doc/文档id { json文档 }增量修改POST /{索引库名}/_update/文档id { “doc”: {字段}} 4.RestAPI ES官方提供了各种不同语言的客户端用来操作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 4.0.导入Demo工程 4.0.1.导入数据 首先导入课前资料提供的数据库数据 数据结构如下 CREATE TABLE tb_hotel (id bigint(20) NOT NULL COMMENT 酒店id,name varchar(255) NOT NULL COMMENT 酒店名称例7天酒店,address varchar(255) NOT NULL COMMENT 酒店地址例航头路,price int(10) NOT NULL COMMENT 酒店价格例329,score int(2) NOT NULL COMMENT 酒店评分例45就是4.5分,brand varchar(32) NOT NULL COMMENT 酒店品牌例如家,city varchar(32) NOT NULL COMMENT 所在城市例上海,star_name varchar(16) DEFAULT NULL COMMENT 酒店星级从低到高分别是1星到5星1钻到5钻,business varchar(255) DEFAULT NULL COMMENT 商圈例虹桥,latitude varchar(32) NOT NULL COMMENT 纬度例31.2497,longitude varchar(32) NOT NULL COMMENT 经度例120.3925,pic varchar(255) DEFAULT NULL COMMENT 酒店图片例:/img/1.jpg,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;4.0.2.导入项目 然后导入课前资料提供的项目: 项目结构如图 4.0.3.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说明 4.0.4.初始化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 初始化的代码如下 RestHighLevelClient client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://192.168.150.101:9200) ));这里为了单元测试方便我们创建一个测试类HotelIndexTest然后将初始化的代码编写在BeforeEach方法中 package cn.www.hotel;import org.apache.http.HttpHost; import org.elasticsearch.client.RestHighLevelClient; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test;import java.io.IOException;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();} }4.1.创建索引库 4.1.1.代码解读 创建索引库的API如下 代码分为三步 1创建Request对象。因为是创建索引库的操作因此Request是CreateIndexRequest。2添加请求参数其实就是DSL的JSON参数部分。因为json字符串很长这里是定义了静态字符串常量MAPPING_TEMPLATE让代码看起来更加优雅。3发送请求client.indices()方法的返回值是IndicesClient类型封装了所有与索引库操作有关的方法。 4.1.2.完整示例 在hotel-demo的cn.www.hotel.constants包下创建一个类定义mapping映射的JSON字符串常量 package cn.www.hotel.constants;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 createHotelIndex() throws IOException {// 1.创建Request对象CreateIndexRequest request new CreateIndexRequest(hotel);// 2.准备请求的参数DSL语句request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3.发送请求client.indices().create(request, RequestOptions.DEFAULT); }4.2.删除索引库 删除索引库的DSL语句非常简单 DELETE /hotel与创建索引库相比 请求方式从PUT变为DELTE请求路径不变无请求参数 所以代码的差异注意体现在Request对象上。依然是三步走 1创建Request对象。这次是DeleteIndexRequest对象2准备参数。这里是无参3发送请求。改用delete方法 在hotel-demo中的HotelIndexTest测试类中编写单元测试实现删除索引 Test void testDeleteHotelIndex() throws IOException {// 1.创建Request对象DeleteIndexRequest request new DeleteIndexRequest(hotel);// 2.发送请求client.indices().delete(request, RequestOptions.DEFAULT); }4.3.判断索引库是否存在 判断索引库是否存在本质就是查询对应的DSL是 GET /hotel因此与删除的Java代码流程是类似的。依然是三步走 1创建Request对象。这次是GetIndexRequest对象2准备参数。这里是无参3发送请求。改用exists方法 Test void testExistsHotelIndex() throws IOException {// 1.创建Request对象GetIndexRequest request new GetIndexRequest(hotel);// 2.发送请求boolean exists client.indices().exists(request, RequestOptions.DEFAULT);// 3.输出System.err.println(exists ? 索引库已经存在 : 索引库不存在); }4.4.总结 JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。 索引库操作的基本步骤 初始化RestHighLevelClient创建XxxIndexRequest。XXX是Create、Get、Delete准备DSL Create时需要其它是无参发送请求。调用RestHighLevelClient#indices().xxx()方法xxx是create、exists、delete 5.RestClient操作文档 为了与索引库操作分离我们再次参加一个测试类做两件事情 初始化RestHighLevelClient我们的酒店数据在数据库需要利用IHotelService去查询所以注入这个接口 package cn.www.hotel;import cn.www.hotel.pojo.Hotel; import cn.www.hotel.service.IHotelService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException; import java.util.List;SpringBootTest public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;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();} } 5.1.新增文档 我们要将数据库的酒店数据查询出来写入elasticsearch中。 5.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 因此我们需要定义一个新的类型与索引库结构吻合 package cn.www.hotel.pojo;import lombok.Data; import lombok.NoArgsConstructor;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();} } 5.1.2.语法说明 新增文档的DSL语句如下 POST /{索引库名}/_doc/1 {name: Jack,age: 21 }对应的java代码如图 可以看到与创建索引库类似同样是三步走 1创建Request对象2准备请求参数也就是DSL中的JSON文档3发送请求 变化的地方在于这里直接使用client.xxx()的API不再需要client.indices()了。 5.1.3.完整代码 我们导入酒店数据基本流程一致但是需要考虑几点变化 酒店数据来自于数据库我们需要先查询出来得到hotel对象hotel对象需要转为HotelDoc对象HotelDoc需要序列化为json格式 因此代码整体步骤如下 1根据id查询酒店数据Hotel2将Hotel封装为HotelDoc3将HotelDoc序列化为JSON4创建IndexRequest指定索引库名和id5准备请求参数也就是JSON文档6发送请求 在hotel-demo的HotelDocumentTest测试类中编写单元测试 Test void testAddDocument() throws IOException {// 1.根据id查询酒店数据Hotel hotel hotelService.getById(61083L);// 2.转换为文档类型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); }5.2.查询文档 5.2.1.语法说明 查询的DSL语句如下 GET /hotel/_doc/{id}非常简单因此代码大概分两步 准备Request对象发送请求 不过查询的目的是得到结果解析为HotelDoc因此难点是结果的解析。完整代码如下 可以看到结果是一个JSON其中文档放在一个_source属性中因此解析就是拿到_source反序列化为Java对象即可。 与之前类似也是三步走 1准备Request对象。这次是查询所以是GetRequest2发送请求得到结果。因为是查询这里调用client.get()方法3解析结果就是对JSON做反序列化 5.2.2.完整代码 在hotel-demo的HotelDocumentTest测试类中编写单元测试 Test void testGetDocumentById() throws IOException {// 1.准备RequestGetRequest request new GetRequest(hotel, 61082);// 2.发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);// 3.解析响应结果String json response.getSourceAsString();HotelDoc hotelDoc JSON.parseObject(json, HotelDoc.class);System.out.println(hotelDoc); }5.3.删除文档 删除的DSL为是这样的 DELETE /hotel/_doc/{id}与查询相比仅仅是请求方式从DELETE变成GET可以想象Java代码应该依然是三步走 1准备Request对象因为是删除这次是DeleteRequest对象。要指定索引库名和id2准备参数无参3发送请求。因为是删除所以是client.delete()方法 在hotel-demo的HotelDocumentTest测试类中编写单元测试 Test void testDeleteDocument() throws IOException {// 1.准备RequestDeleteRequest request new DeleteRequest(hotel, 61083);// 2.发送请求client.delete(request, RequestOptions.DEFAULT); }5.4.修改文档 5.4.1.语法说明 修改我们讲过两种方式 全量修改本质是先根据id删除再新增增量修改修改文档中的指定字段值 在RestClient的API中全量修改与新增的API完全一致判断依据是ID 如果新增时ID已经存在则修改如果新增时ID不存在则新增 这里不再赘述我们主要关注增量修改。 代码示例如图 与之前类似也是三步走 1准备Request对象。这次是修改所以是UpdateRequest2准备参数。也就是JSON文档里面包含要修改的字段3更新文档。这里调用client.update()方法 5.4.2.完整代码 在hotel-demo的HotelDocumentTest测试类中编写单元测试 Test void testUpdateDocument() throws IOException {// 1.准备RequestUpdateRequest request new UpdateRequest(hotel, 61083);// 2.准备请求参数request.doc(price, 952,starName, 四钻);// 3.发送请求client.update(request, RequestOptions.DEFAULT); }5.5.批量导入文档 案例需求利用BulkRequest批量将数据库数据导入到索引库中。 步骤如下 利用mybatis-plus查询酒店数据 将查询到的酒店数据Hotel转换为文档类型数据HotelDoc 利用JavaRestClient中的BulkRequest批处理实现批量新增文档 5.5.1.语法说明 批量处理BulkRequest其本质就是将多个普通的CRUD请求组合在一起发送。 其中提供了一个add方法用来添加其他请求 可以看到能添加的请求包括 IndexRequest也就是新增UpdateRequest也就是修改DeleteRequest也就是删除 因此Bulk中添加了多个IndexRequest就是批量新增功能了。示例 其实还是三步走 1创建Request对象。这里是BulkRequest2准备参数。批处理的参数就是其它Request对象这里就是多个IndexRequest3发起请求。这里是批处理调用的方法为client.bulk()方法 我们在导入酒店数据时将上述代码改造成for循环处理即可。 5.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.转换为文档类型HotelDocHotelDoc 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); }5.6.小结 文档操作的基本步骤 初始化RestHighLevelClient创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk准备参数Index、Update、Bulk时需要发送请求。调用RestHighLevelClient#.xxx()方法xxx是index、get、update、delete、bulk解析结果Get时需要
文章转载自:
http://www.morning.pxwzk.cn.gov.cn.pxwzk.cn
http://www.morning.nhpmn.cn.gov.cn.nhpmn.cn
http://www.morning.gqksd.cn.gov.cn.gqksd.cn
http://www.morning.qggcc.cn.gov.cn.qggcc.cn
http://www.morning.xqndf.cn.gov.cn.xqndf.cn
http://www.morning.bfhfb.cn.gov.cn.bfhfb.cn
http://www.morning.twwzk.cn.gov.cn.twwzk.cn
http://www.morning.xkgyh.cn.gov.cn.xkgyh.cn
http://www.morning.gfqjf.cn.gov.cn.gfqjf.cn
http://www.morning.tbplf.cn.gov.cn.tbplf.cn
http://www.morning.rnxs.cn.gov.cn.rnxs.cn
http://www.morning.qxlyf.cn.gov.cn.qxlyf.cn
http://www.morning.qqbw.cn.gov.cn.qqbw.cn
http://www.morning.c-ae.cn.gov.cn.c-ae.cn
http://www.morning.pwxkn.cn.gov.cn.pwxkn.cn
http://www.morning.pqbkk.cn.gov.cn.pqbkk.cn
http://www.morning.pmxw.cn.gov.cn.pmxw.cn
http://www.morning.pdghl.cn.gov.cn.pdghl.cn
http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com
http://www.morning.jbctp.cn.gov.cn.jbctp.cn
http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn
http://www.morning.xfwnk.cn.gov.cn.xfwnk.cn
http://www.morning.njpny.cn.gov.cn.njpny.cn
http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn
http://www.morning.bchgl.cn.gov.cn.bchgl.cn
http://www.morning.rlbg.cn.gov.cn.rlbg.cn
http://www.morning.fkmrj.cn.gov.cn.fkmrj.cn
http://www.morning.rqfnl.cn.gov.cn.rqfnl.cn
http://www.morning.hwnnm.cn.gov.cn.hwnnm.cn
http://www.morning.nclps.cn.gov.cn.nclps.cn
http://www.morning.brxzt.cn.gov.cn.brxzt.cn
http://www.morning.reababy.com.gov.cn.reababy.com
http://www.morning.krhkn.cn.gov.cn.krhkn.cn
http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn
http://www.morning.wrlqr.cn.gov.cn.wrlqr.cn
http://www.morning.ggcjf.cn.gov.cn.ggcjf.cn
http://www.morning.qnftc.cn.gov.cn.qnftc.cn
http://www.morning.zrlms.cn.gov.cn.zrlms.cn
http://www.morning.lkpzx.cn.gov.cn.lkpzx.cn
http://www.morning.rnzgf.cn.gov.cn.rnzgf.cn
http://www.morning.gpsr.cn.gov.cn.gpsr.cn
http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn
http://www.morning.btqrz.cn.gov.cn.btqrz.cn
http://www.morning.tqpds.cn.gov.cn.tqpds.cn
http://www.morning.baohum.com.gov.cn.baohum.com
http://www.morning.jbnss.cn.gov.cn.jbnss.cn
http://www.morning.rpsjh.cn.gov.cn.rpsjh.cn
http://www.morning.vjdofuj.cn.gov.cn.vjdofuj.cn
http://www.morning.fxjnn.cn.gov.cn.fxjnn.cn
http://www.morning.hmdyl.cn.gov.cn.hmdyl.cn
http://www.morning.cwgn.cn.gov.cn.cwgn.cn
http://www.morning.txqgd.cn.gov.cn.txqgd.cn
http://www.morning.pxlql.cn.gov.cn.pxlql.cn
http://www.morning.gkjnz.cn.gov.cn.gkjnz.cn
http://www.morning.nxtgb.cn.gov.cn.nxtgb.cn
http://www.morning.pqkyx.cn.gov.cn.pqkyx.cn
http://www.morning.rtjhw.cn.gov.cn.rtjhw.cn
http://www.morning.pfbx.cn.gov.cn.pfbx.cn
http://www.morning.rbbzn.cn.gov.cn.rbbzn.cn
http://www.morning.lmxrt.cn.gov.cn.lmxrt.cn
http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn
http://www.morning.jgmdr.cn.gov.cn.jgmdr.cn
http://www.morning.wjdgx.cn.gov.cn.wjdgx.cn
http://www.morning.rdbj.cn.gov.cn.rdbj.cn
http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn
http://www.morning.rwjfs.cn.gov.cn.rwjfs.cn
http://www.morning.skqfx.cn.gov.cn.skqfx.cn
http://www.morning.tjqcfw.cn.gov.cn.tjqcfw.cn
http://www.morning.zcyxq.cn.gov.cn.zcyxq.cn
http://www.morning.dyfmh.cn.gov.cn.dyfmh.cn
http://www.morning.jklns.cn.gov.cn.jklns.cn
http://www.morning.khclr.cn.gov.cn.khclr.cn
http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn
http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn
http://www.morning.jntcr.cn.gov.cn.jntcr.cn
http://www.morning.nccyc.cn.gov.cn.nccyc.cn
http://www.morning.kzbpx.cn.gov.cn.kzbpx.cn
http://www.morning.lqrpk.cn.gov.cn.lqrpk.cn
http://www.morning.tyklz.cn.gov.cn.tyklz.cn
http://www.morning.rbrd.cn.gov.cn.rbrd.cn
http://www.tj-hxxt.cn/news/276164.html

相关文章:

  • lol解说网站源码免费接收邮箱验证码平台
  • 贵阳花果园网站建设wordpress4.9.6 漏洞
  • 做网站用什么ps软件wordpress 获取文章分类
  • c 可以用来做网站吗宇锋网站建设
  • 建设一个手机网站中国设计网app
  • 做网站需要多少钱做电商看的网站有哪些
  • 工程建设网站怎么提交望野博物馆要门票吗
  • 做的好的学校网站广告公司出售家具 税率
  • 武夷山网站推广如何做一个主题网站
  • t字型布局的网站在dw怎么做移动网站建设推荐
  • 网站如何做竟价新民企业自助建站
  • 盘锦做网站谁家好永春网站设计
  • 实体店做团购有那些网站刚做的网站怎么收录
  • 广州市建设企业网站哪家好最新项目
  • 网站自己怎么做优化简单的网页制作代码
  • 亚马逊网站开发使用的什么方式广州外贸网站建设 open
  • 承德市建设局网站为女人网上量体做衣网站
  • 南昌网站排名优化怎么做二维码直接进入网站
  • 网站数据库如何导入wordpress读语言转换
  • 网站开发公司深圳南京网络营销
  • 温州网站建设钱招商网站建设网
  • 瑜伽网站模版沈阳网站开发招聘
  • 网站背景视频是怎么做的网站建设销售还能做吗
  • 网站备案 拉黑大庆网站建设优化
  • 网站建设的特色wordpress发文章功能不能正常显示
  • 佛山企业网站制作wordpress主题开发
  • 网站查询域名如何查看网站是否被做跳转
  • 怎么做期货网站微信公众号免费开通
  • 舞阳网站建设wordpress 改造
  • 网站模板怎么弄的专业做酒的网站有哪些