网站服务器一个多少钱,门店门面设计效果图,深圳企业网络推广公司,关键词汇总目录
初识elasticsearch
什么是elasticsearch
elasticsearch的发展
Lucene的优缺点
elasticsearch的优势
倒排索引
es与mysql的概念对比
文档
索引
概念对比
架构
安装es
安装kibana
安装ik分词器
分词器
安装ik分词器
ik分词器的拓展和停用词典
操作索引库…目录
初识elasticsearch
什么是elasticsearch
elasticsearch的发展
Lucene的优缺点
elasticsearch的优势
倒排索引
es与mysql的概念对比
文档
索引
概念对比
架构
安装es
安装kibana
安装ik分词器
分词器
安装ik分词器
ik分词器的拓展和停用词典
操作索引库
mapping属性
创建索引库
查询、删除、修改索引库
文档操作
新增查询删除文档
修改文档
方法一全量修改
方法二增量修改
RestClient的操作
什么是RestClient
hotel数据结构分析
索引库操作
初始化JavaRestClient
创建索引库
删除索引库
判断索引库是否存在
文档操作
初始化JavaRestClient
添加文档
查询文档
修改文档
删除文档
批量导入文档 什么是elasticsearch 1、一个开源的分布式搜索引擎可以用来实现搜索、日志统计、分析、系统监控等功能 什么是elastic stack (ELK) 2、是以elasticsearch为核心的技术栈包括beats、Logstash、kibana、elasticsearch 什么是Lucene 3、是Apache的开源搜索引擎类库提供了搜索引擎的核心API 什么是文档和词条 1、每一条数据就是一个文档 2、对文档中的内容分词得到的词语就是词条 什么是正向索引 1、基于文档id创建索引。查询词条时必须先找到文档而后判断是否包含词条 什么是倒排索引 1、对文档内容分词对词条创建索引并记录词条所在文档的信息。查询时先根据词条查询到文档id而后获取到文档 文档一条数据就是一个文档es中是Json格式 字段Json文档中的字段 索引同类型文档的集合 映射索引中文档的约束比如字段名称、类型 elasticsearch与数据库的关系 1、数据库负责事务类型操作 2、elasticsearch负责海量数据的搜索、分析、计算 分词器的作用是什么 1、创建倒排索引时对文档分词 2、用户搜索时对输入的内容分词 IK分词器有几种模式 1、ik_smart智能切分粗粒度 2、ik_max_word最细切分细粒度 IK分词器如何拓展词条如何停用词条 1、利用config目录的lkAnalyzer.cfg.xml文件添加拓展词典和停用词典 2、在词典中添加拓展词条或者停用词条 mapping常见属性有哪些 1、type数据类型 2、index是否索引 3、analyzer分词器 4、properties子字段 type常见的有哪些 1、字符串text、keyword 2、数字long、integer、short、 byte、double、float 3、布尔boolean 4、日期date 5、对象object 索引库操作有哪些 1、创建索引库PUT/索引库名 2、查询索引库GET/索引库名 3、删除索引库DELETE/索引库名 4、添加字段PUT/索引库名/_mapping 文档操作有哪些 1、创建文档POST/索引库名/_doc/文档id { json文档} 2、查询文档GET/索引库名/_doc/文档id 3、删除文档DELETE/索引库名/_doc/文档id 4、修改文档: 全量修改PUT/索引库名/_doc/文档id { json文档} 增量修改POST/索引库名/_update/文档id { doc:{字段}} 索引库操作的基本步骤 1、初始化RestHighLevelClient 2、创建XxxIndexRequest。XXX是CREATE、Get、Delete 3、准备DSL ( CREATE时需要) 4、发送请求。调用RestHighLevelClient#tindices().xxx()方法xxx是create、exists、delete 文档操作的基本步骤 1、初始化RestHighLevelClient 2、创建XxxRequest。XXX是Index、Get、Update、Delete 3、准备参数(Index和Update时需要) 4、发送请求。调用RestHighLevelClient#t.xxx()方法xxx是index、get、update、delete 5、解析结果Get时需要) 初识elasticsearch
什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats也就是elastic stack (ELK)。被广泛应用在日志数据分析、实时监控等领域。 elasticsearch是elastic stack的核心负责存储、搜索、分析数据。 elasticsearch的发展
Lucene的优缺点 Lucene的优势 1、易扩展 2、高性能基于倒排索引) Lucene的缺点 1、只限于Java语言开发 2、学习曲线陡峭 3、不支持水平扩展 elasticsearch的优势 相比与lucene, elasticsearch具备下列优势: 1、支持分布式可水平扩展 2、提供Restful接口可被任何语言调用 倒排索引 elasticsearch采用倒排索引: 1、文档(document)每条数据就是一个文档 2、词条(term)文档按照语义分成的词语 es与mysql的概念对比
文档 1、elasticsearch是面向文档存储的可以是数据库中的一条商品数据一个订单信息。 2、文档数据会被序列化为json格式后存储在elasticsearch中。 索引 索引 ( index)相同类型的文档的集合 映射(mapping)索引中文档的字段约束信息类似表的结构约束 概念对比
MySQLElasticsearch说明TableIndex索引index就是文档的集合类似数据库的表tableRowDocument文档Document就是一条条的数据类似数据库中的行ROW文档都是JSON格式ColumnField字段Field就是JSON文档中的字段类似数据库中的列ColumnSchemaMappingMapping映射是索引中文档的约束例如字段类型约束。类似数据库的表结构SchemaSQLDSLDSL是elasticsearch提供的JSON风格的请求语句用来操作elasticsearch,实现CRUD
架构 Mysql擅长事务类型操作可以确保数据的安全和一致性 Elasticsearch擅长海量数据的搜索、分析、计算 安装es
创建网络es-net是自己取的名字随便取 docker network create es-net 加载镜像使用提供的es.tar拖到虚拟机的tmp目录下
es.tarhttps://pan.baidu.com/s/13Z74D-liQaDL0_tM-Rl7Rg?pwd47qm运行加载命令 docker load -i es.tar 运行docker命令 docker run -d \ --name es \ -e ES_JAVA_OPTS-Xms512m -Xmx512m \ -e discovery.typesingle-node \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1 访问网页虚拟机ip和9200端口。成功 安装kibana
加载镜像使用提供的es.tar拖到虚拟机的tmp目录下
kibanahttps://pan.baidu.com/s/1N3NiLRxLzX42jMxkK9ackQ?pwdlh2y运行docker命令 docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTShttp://es:9200 \ --networkes-net \ -p 5601:5601 \ kibana:7.12.1 访问网页虚拟机ip和5601端口。成功 点击主页的Explore on my own后打开Dev Tools 模拟一次请求可以看到右边的数据和端口9200的数据一模一样 安装ik分词器
分词器
es在创建倒排索引时需要对文档分词;在搜索时需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。 语法说明 POST请求方式 /_analyze请求路径 请求参数json风格analyzer:分词器类型。text要分词的内容 我们可以看到右边的数据分词并不友好比如世界本应该是一起的它却分开了 安装ik分词器
查看es-plugins数据卷所在的位置 docker volume inspect es-plugins 把ik文件夹放到该路径Mountpoint就是要的位置
ik文件夹https://pan.baidu.com/s/1EIkGJDvVjcGx06hDUo34Eg?pwddads重启es docker restart es 测试 ik_smart最少切分 ik_max_word最细切分 ik_smart从最多字开始判断是否切分若切分则不会再继续判断已被切分的词是否继续切分 ik_max_word会判断每个词是否能再继续分 ik分词器的拓展和停用词典
修改一个ik分词器目录中的config目录中的lkAnalyzer.cfg.xml文件
在第一个箭头这行添加ext.dic这是要用来拓展词典的文件要在lkAnalyzer.cfg.xml所在的同级目录下创建出来。
在第二个箭头这行添加stopword.dic这是要用来停用词典的文件在lkAnalyzer.cfg.xml所在的同级目录已经创建好了不需要再创建。 在ext.dic添加要拓展的词典 在stopword.dic添加要停用的词典 重启es这次重启后需要几十秒的时间才能访问网站否则网站会报错 docker restart es 再次访问网站可以看到这次测试“奥利给”并没有被分开并且“的”字并没有出现在右边。
是因为“奥利给”被写进了ext.dic “的”被写进了stopword.dic 操作索引库
mapping属性
mapping是对索引库中文档的约束常见的mapping属性包括 1、type字段数据类型常见的简单类型有: 1.1、字符串text(可分词的文本)、keyword精确值例如:品牌、国家、ip地址) 1.2、数值long、integer、short、byte、double、float 1.3、布尔boolean 1.4、日期date 1.5、对象object 2、index是否创建索引默认为true 3、analyzer使用哪种分词器 4、properties该字段的子字段 创建索引库
这里创建了一个名叫heima的索引库mappings代表它是做映射的properties代表里面是具体的字段type代表该字段的数据类型analyzer代表该字段的分词器index代表该字段是否创建索引 PUT /heima { mappings: { properties: { info:{ type: text, analyzer: ik_smart }, email: { type: keyword, index: false }, name: { type: object, properties: { firstName: { type: keyword }, lastName: { type: keyword } } } } } } 运行该DSL语句后右边会出现创建的索引库名字代表创建成功 查询、删除、修改索引库
查看索引库语法 GET /索引库名称 删除索引库语法 DELETE /索引库名 索引库和mapping一旦创建无法修改但是可以添加新的字段 PUT /索引库名称/_mapping { properties: { 新字段名: { } } } 文档操作
新增查询删除文档
新增文档语法 POST /索引库名/_doc/文档id { 字段1: 值1, 字段2: 值2, 字段3: { 子属性1: 值3, 子属性2: 值4 } } 新增文档右边的数据result为created。成功 查询文档语法 GET /索引库名/_doc/文档id 查询文档右边会出现文档的数据。成功 删除文档语法 DELETE /索引库名/_doc/文档id 删除文档右边数据result为deleted成功 修改文档
方法一全量修改
会删除旧文档添加新文档 PUT /索引库名/_doc/文档id { 字段1: 值1, 字段2: 值2 } 当文档存在时修改后右边的数据result为updated。修改成功 当文档不存在时修改变成了创建。 方法二增量修改
修改指定的字段注意只能写指定的字段而不是把所有字段都写上 POST /索引库名/_update/文档id { doc: { 字段1: 值1 } } 修改后右边的result为updated。修改成功 RestClient的操作
什么是RestClient ES官方提供了各种不同语言的客户端用来操作ES。这些客户端的本质就是组装DSL语句通过http请求发送给ES。 下载提供的资料
hotel的demo和sqlhttps://pan.baidu.com/s/1uxl7PzshHu09PXsd9zDWbA?pwdv8bf在本地新建一个数据库heima若使用其他数据库名记得在demo里修改yml文件
hotel数据结构分析
写出数据库中该表的DSL语句但是不要执行。我们要使用java来执行 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 }, 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 } } } } 索引库操作
初始化JavaRestClient
在hotel.pom文件中引入es的RestHighLevelclient依赖 !--elasticsearch--
dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactId
/dependency因为SpringBoot默认的ES版本是7.6.2所以我们需要覆盖默认的ES版本 propertiesjava.version1.8/java.versionelasticsearch.version7.12.1/elasticsearch.version
/properties ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.10.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcn.itcast.demo/groupIdartifactIdhotel-demo/artifactIdversion0.0.1-SNAPSHOT/versionnamehotel-demo/namedescriptionDemo project for Spring Boot/descriptionpropertiesjava.version1.8/java.versionelasticsearch.version7.12.1/elasticsearch.version/propertiesdependencies!--elasticsearch--dependencygroupIdorg.elasticsearch.client/groupIdartifactIdelasticsearch-rest-high-level-client/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.4.2/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scopeexclusionsexclusiongroupIdorg.junit.vintage/groupIdartifactIdjunit-vintage-engine/artifactId/exclusion/exclusions/dependency!--FastJson--dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.71/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactId/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationexcludesexcludegroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/exclude/excludes/configuration/plugin/plugins/build/project初始化RestHighLevelClientxxx填虚拟机ip RestHighLevelclient client new RestHighLevelclgent(RestClient.builder( HttpHost.create( http://xxx.xxx.xxx.xxx:9200) ) ); 该代码我写成了 BeforeEach
void setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));
}AfterEach
void tearDown() throws IOException {this.client.close();
}package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;Testvoid testInit() {System.out.println(client);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}创建索引库
这个MAPPING_TEMPLATE的位置是要填写DSL语句但因为太长我就把它写成了常量 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);
} package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;Testvoid testInit() {System.out.println(client);}Testvoid 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);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}public static final String MAPPING_TEMPLATE ;package cn.itcast.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 },\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 };
}运行测试代码可以看到控制台运行成功。 删除索引库 Test
void testDeleteHotelIndex() throws IOException {//1、创建Request对象DeleteIndexRequest request new DeleteIndexRequest(hotel);//2、发送请求client.indices().delete(request, RequestOptions.DEFAULT);
}package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;Testvoid testInit() {System.out.println(client);}Testvoid 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);}Testvoid testDeleteHotelIndex() throws IOException {//1、创建Request对象DeleteIndexRequest request new DeleteIndexRequest(hotel);//2、发送请求client.indices().delete(request, RequestOptions.DEFAULT);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}点击该测试控制台运行成功。 判断索引库是否存在 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 ? 索引库存在 : 索引库不存在);
}package cn.itcast.hotel;import net.sf.jsqlparser.statement.create.index.CreateIndex;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.io.IOException;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;public class HotelIndexTest {private RestHighLevelClient client;Testvoid testInit() {System.out.println(client);}Testvoid 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);}Testvoid testDeleteHotelIndex() throws IOException {//1、创建Request对象DeleteIndexRequest request new DeleteIndexRequest(hotel);//2、发送请求client.indices().delete(request, RequestOptions.DEFAULT);}Testvoid testExistsHotelIndex() throws IOException {//1、创建Request对象GetIndexRequest request new GetIndexRequest(hotel);//2、发送请求boolean exists client.indices().exists(request, RequestOptions.DEFAULT);//3、输出System.err.println(exists ? 索引库存在 : 索引库不存在);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}运行该测试控制台运行成功并且打印了“索引库不存在”因为刚刚删除了索引库 文档操作
初始化JavaRestClient
xxx写虚拟机ip BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}SpringBootTest
public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}
添加文档 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({\name\:\Jack\,\age\:21},XContentType.JSON);//3、发送请求client.index(request,RequestOptions.DEFAULT);
} 我这里的第二步用的是实体类转JSON的方式
package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
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;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;SpringBootTest
public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;Testvoid 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);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}实体类
package cn.itcast.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();}
}运行该测试控制台运行成功 查询文档 Test
void testGetDocumentById() throws IOException {//1、准备RequestGetRequest request new GetRequest(hotel, 61083);//2、发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json response.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);
}package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
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;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;SpringBootTest
public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;Testvoid 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);}Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request new GetRequest(hotel, 61083);//2、发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json response.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}运行该测试控制台运行成功并且把数据打印了出来 修改文档
这里我只演示局部更新 Test
void testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request new UpdateRequest(hotel, 61083);//2、准备请求参数request.doc(price, 952,starName, 四钻);//3、发送请求client.update(request,RequestOptions.DEFAULT);
} package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
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;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;SpringBootTest
public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;Testvoid 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);}Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request new GetRequest(hotel, 61083);//2、发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json response.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}Testvoid testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request new UpdateRequest(hotel, 61083);//2、准备请求参数request.doc(price, 952,starName, 四钻);//3、发送请求client.update(request,RequestOptions.DEFAULT);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}运行该测试控制台运行成功 删除文档 Test
void testDeleteDocument() throws IOException {//1、准备RequestDeleteRequest request new DeleteRequest(hotel, 61083);//2、发送请求client.delete(request,RequestOptions.DEFAULT);
}package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
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;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;SpringBootTest
public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;Testvoid 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);}Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request new GetRequest(hotel, 61083);//2、发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json response.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}Testvoid testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request new UpdateRequest(hotel, 61083);//2、准备请求参数request.doc(price, 952,starName, 四钻);//3、发送请求client.update(request,RequestOptions.DEFAULT);}Testvoid testDeleteDocument() throws IOException {//1、准备RequestDeleteRequest request new DeleteRequest(hotel, 61083);//2、发送请求client.delete(request,RequestOptions.DEFAULT);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}运行该测试控制台运行成功 批量导入文档 Test
void testBulkRequest() throws IOException {//1、创建RequestBulkRequest request new BulkRequest();//2、准备参数添加多个新增的Request这里添加两个数据分别是id为101和102的数据request.add(new IndexRequest(hotel).id(101).source(json source, XContentType.JSON));request.add(new IndexRequest(hotel).id(102).source(json source, XContentType.JSON));//3、发送请求client.bulk(request,RequestOptions.DEFAULT);
}我这里改成这样是因为我要把该表的所有数据都导入文档 Test void testBulkRequest() throws IOException { //批量查询酒店数据 ListHotel hotels hotelService.list(); //1、创建Request BulkRequest request new BulkRequest(); //2、准备参数添加多个新增的Request for(Hotel hotel:hotels){ //转换为文档类型HotelDoc HotelDoc hotelDoc new HotelDoc(hotel); //创建新增文档的Request对象 request.add(new IndexRequest(hotel) .id(hotelDoc.getId().toString()) .source(JSON.toJSONString(hotelDoc),XContentType.JSON)); } //3、发送请求 client.bulk(request,RequestOptions.DEFAULT); } package cn.itcast.hotel;import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;
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;import static cn.itcast.hotel.constants.HotelConstants.MAPPING_TEMPLATE;SpringBootTest
public class HotelDocumentTest {Autowiredprivate IHotelService hotelService;private RestHighLevelClient client;Testvoid 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);}Testvoid testGetDocumentById() throws IOException {//1、准备RequestGetRequest request new GetRequest(hotel, 61083);//2、发送请求得到响应GetResponse response client.get(request, RequestOptions.DEFAULT);//3、解析响应结果String json response.getSourceAsString();//反序列化HotelDoc hotelDoc JSON.parseObject(json,HotelDoc.class);System.out.println(hotelDoc);}Testvoid testUpdateDocument() throws IOException {//1、准备RequestUpdateRequest request new UpdateRequest(hotel, 61083);//2、准备请求参数request.doc(price, 952,starName, 四钻);//3、发送请求client.update(request,RequestOptions.DEFAULT);}Testvoid testDeleteDocument() throws IOException {//1、准备RequestDeleteRequest request new DeleteRequest(hotel, 61083);//2、发送请求client.delete(request,RequestOptions.DEFAULT);}Testvoid testBulkRequest() throws IOException {//批量查询酒店数据ListHotel hotels hotelService.list();//1、创建RequestBulkRequest request new BulkRequest();//2、准备参数添加多个新增的Requestfor(Hotel hotel:hotels){//转换为文档类型HotelDocHotelDoc hotelDoc new HotelDoc(hotel);//创建新增文档的Request对象request.add(new IndexRequest(hotel).id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));}//3、发送请求client.bulk(request,RequestOptions.DEFAULT);}BeforeEachvoid setUp() {this.client new RestHighLevelClient(RestClient.builder(HttpHost.create(http://xxx.xxx.xxx.xxx:9200)));}AfterEachvoid tearDown() throws IOException {this.client.close();}
}运行该测试控制台运行成功并且可以看到导入了201条数据正好表的数据量 代码文件点击下载https://pan.baidu.com/s/1NJnwlfThymqPRhqWqqP0FQ?pwd6c0n 上一篇SpringAMQP的配置和使用