【SpringCloud——Elasticsearch(上)】

news/2024/11/8 23:00:47/

一、什么是Elasticsearch

        elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。

 二、倒排索引

1、正向索引

2、倒排索引

 3、总结

 三、ES和MySQL的区别

 

四、操作索引库

1、基于Kibana(WEB界面)

以下操作均根据以上数据库表进行:

 ①、创建索引库

#创建索引库
PUT /music
{"mappings": {"properties": {"title":{"type": "text","analyzer": "ik_smart"},"singer":{"type": "object","properties": {"firstname":{"type":"keyword"},"lastname":{"type":"keyword"}}},"time":{"type": "date","index": false},"url":{"type": "keyword","index": false},"userid":{"type": "text","index": false}}}
}

②、查看索引库

#获取索引库
GET /music

③、修改索引库

索引库和mapping一旦创建则无法修改,但是可以添加新的字段。

#为索引库添加字段(仅支持新增字段,不支持修改字段)
PUT /music/_mapping
{"properties":{"id":{"type":"integer","index":false}}
}

④、删除索引库

#删除索引库
DELETE /music

2、基于RestClient(代码)

1.Java项目导入es的RestHighLevelClient依赖:

        <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.12.1</version></dependency>

2.因为SpringBoot默认的ES版本为7.6.2,所以我们需要覆盖默认的ES版本:

    <properties><java.version>1.8</java.version><elasticsearch.version>7.12.1</elasticsearch.version></properties>

3.初始化RestHighLevelClient(单元测试中执行)

    private RestHighLevelClient client;@BeforeEachvoid setClient(){this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://XXXX:9200")));}@AfterEachvoid tearDown() throws Exception{this.client.close();}
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`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 以下操作均根据以上数据库表进行:

①、编写mapping映射

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"},"star_name":{"type": "keyword"},"bussiness":{"type": "keyword","copy_to": "all"},"location":{"type": "geo_point"},"pic":{"type": "keyword","index": false},"all":{"type": "text","analyzer": "ik_max_word"}}}
}

 copy_to属性的作用:支持多条件搜索查询

 ②、创建索引库

    //索引库创建@Testvoid createHotelIndex() throws IOException {//1.创建Request对象CreateIndexRequest request = new CreateIndexRequest("hotel");//2.准备请求的参数,DSL语句//MAPPING_TEMPLATE 就是我们编写的mapping映射中的DSLrequest.source(MAPPING_TEMPLATE, XContentType.JSON);//3.发送请求client.indices().create(request, RequestOptions.DEFAULT);}

②、删除索引库

    //删除索引库@Testvoid deleteHotelIndex() throws IOException {DeleteIndexRequest request = new DeleteIndexRequest("hotel");client.indices().delete(request,RequestOptions.DEFAULT);}

③、查看索引库是否存在

    //判断索引库是否存在@Testvoid testExistHotelIndex() throws IOException {GetIndexRequest request = new GetIndexRequest("hotel");boolean ret = client.indices().exists(request,RequestOptions.DEFAULT);System.err.println(ret);}

五、操作文档

1、基于Kibana(WEB界面)

※参考四当中基于Kibana生成的索引库进行以下文档操作:

①、插入文档

#插入文档(新增数据)
POST /music/_doc/1
{"id":1,"title":"爱在西元前","singer":{"firstname":"周","lastname":"杰伦"},"time":"2022-01-01T12:00:00.000Z","url":"/music/get?path=茜茜 - 爱在西元前","userid":"1966998940"
}

②、获取文档

#查询文档
GET /music/_doc/1

③、修改文档

方式一:全量修改,会删除旧文档,添加新文档(如果旧文档不存在则创建

PUT /music/_doc/1
{"id":1,"title":"爱在西元前","singer":{"firstname":"周杰伦","lastname":"Jay"},"time":"2022-01-01T12:00:00.000Z","url":"/music/get?path=茜茜 - 爱在西元前","userid":"1966998940"
}

方式二:局部修改,只修改指定字段

POST /music/_update/1
{"doc": {"title":"爱不在西元前"}
}

④、删除文档

#删除文档
DELETE /music/_doc/1

2、基于RestClient(代码)

※参考四当中基于RestClient生成的索引库及其数据库数据进行以下文档操作:

①、新增数据库数据到索引库

    //添加数据到索引库@Testvoid addDataToHotelIndex() throws IOException {//根据id查询酒店数据Hotel hotel = hotelService.getById(61083L);//转换为Doc文档类型HotelDoc doc = new HotelDoc(hotel);//1.准备request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());//2.准备Json文档request.source(JSON.toJSONString(doc), XContentType.JSON);//3.发送请求client.index(request, RequestOptions.DEFAULT);}

 HotelDoc实体类:

@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();}
}

②、根据ID查询索引库数据

    //根据id查询酒店数据@Testvoid queryDataFromHotelIndex() throws IOException {//1.创建request对象GetRequest 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 deleteDocument() throws IOException {//1.准备RequestDeleteRequest request = new DeleteRequest("hotel","61083");//2.发送请求client.delete(request,RequestOptions.DEFAULT);}

④、修改酒店数据

    //修改文档数据@Testvoid updateDocument() throws IOException {//1.准备RequestUpdateRequest request = new UpdateRequest("hotel","61083");//2.准备请求参数request.doc("brand","皇冠假日酒店","starName","四星");//3.发送请求client.update(request,RequestOptions.DEFAULT);}

⑤、批量导入数据库数据到索引库

    //批量新增文档数据@Testvoid testBulkRequest() throws IOException {//1.创建RequestBulkRequest request = new BulkRequest();//2.准备Json文档//批量查询酒店数据List<Hotel> list =  hotelService.list();for (int i = 0; i < list.size(); i++) {HotelDoc hotelDoc = new HotelDoc(list.get(i));request.add(new IndexRequest("hotel").id(hotelDoc.getId().toString()).source(JSON.toJSONString(hotelDoc),XContentType.JSON));}//3.发送请求client.bulk(request,RequestOptions.DEFAULT);}


http://www.ppmy.cn/news/109959.html

相关文章

[GXYCTF2019]Ping Ping Ping解题过程

1、来看看靶场 发现就只有这个提示&#xff0c;尝试一下在url输入框进行测试 页面返回ping的结果&#xff0c;然后我之前也做过另外一道类似的题 链接&#xff1a;[ACTF2020 新生赛]Exec1命令注入_[actf2020 新生赛]exec 1_旺仔Sec的博客-CSDN博客 尝试用管道符 果然是可以的…

进步之魂:致敬科技工作者!

在科技的舞台上&#xff0c;技术人员如同一束明亮的光芒&#xff0c;照亮着人类前进的道路。他们是创造者&#xff0c;是传递者&#xff0c;默默无闻地工作在科技的前线&#xff0c;将智慧和汗水交织成一道奇迹般的桥梁&#xff0c;将人与人、人与世界紧密地连接在一起。时代的…

项目文件模板-项目建议书

文章目录 第一章 项目简介第二章 项目建设单位概况第三章 项目建设的必要性第四章 业务分析第五章 总体建设方案第六章 本期项目建设方案第七章 环保 消防 职业安全第八章 项目实施进度第九章 投资估算和资金筹措第十章 效益与风险分析 第一章 项目简介 项目名称 项目建设单位…

【C++】函数高级 - 默认参数,占位参数,函数重载基本语法,函数重载注意事项

No.Contents1【C】基础知识 - HelloWorld&#xff0c;注释&#xff0c;变量&#xff0c;常量&#xff0c;关键字&#xff0c;标识符2【C】数据类型 - 整型&#xff0c;sizeof&#xff0c;实型&#xff0c;字符型&#xff0c;转义字符&#xff0c;字符串类型&#xff0c;布尔类型…

Jimmer VS MyBatisPlus查询自关联表

首发于Enaium的个人博客 本文是对Jimmer文档中对象抓取器-自关联递归抓取部分的介绍,之后会对比MyBatisPlus的查询自关联表的能力。 对象抓取器是 jimmer-sql 一个非常强大的特征&#xff0c;具备可媲美 GraphQL 的能力。 即使用户不采用任何 GraphQL 相关的技术栈&#xff0c;…

Sql Server 自动备份

Sql Server 自动备份 文章目录 Sql Server 自动备份1. 打开SQL Server&#xff0c;在管理下找到”维护计划”&#xff0c;右键点击”维护计划向导”&#xff0c;如图&#xff1b;2. 再次点击维护计划向导3. 在选择维护任务下勾选”备份数据库”、”清楚维护任务”4.选择需要备份…

项目文件模板-项目章程

项目目的或批准项目的原因 可测量的项目目标和相关的成果标准 高层级需求 高层级项目需求 高层级风险 总体里程碑进度计划 总体预算 干系人清单 项目审批要求&#xff08;什么构成项目成功 谁决定 谁签署&#xff09; 委派的项目经理及其职责 发起人或其他批准项目章程的人员姓…

Seata 分布式事务-应用实例

Seata 分布式事务-应用实例 需求分析/图解 需求&#xff1a;完成下订单功能&#xff0c;由三个微服务模块协同完成, 涉及到多数据库, 多张表 分析 黑色线是执行顺序线 红色线是想Seata Server注册 最后紫色线是决定是否提交和回滚 项目目录 主题包结构都是一样的但是类名字…