1,传统上以行和列的形式存储数据到关系型数据库中,但是这种存储形式在存储复杂问题的时候会很不灵活。将对象按对象的方式来存储,这样我们就能更加专注于使用数据,重新利用对象的灵活性。而JSON
是一种以人可读的文本表示对象的方法,它已经变成NoSQL
世界交换数据的事实标准。
ElasticSearch
是一个分布式、可扩展、实时的搜索与数据分析引擎。特点是面向文档:意味着存储的是整个对象或文档,而不是类似于Mysql
的行列数据;使用JSON
作为文档序列化格式,简单简洁且易于阅读。Spring Data Elasticsearch
是Spring提供的一种以Spring Data风格来操作数据存储的方式,自定义Repository
继承ElasticsearchRepository
接口可以获得常用的数据操作方法,轻松实现对ElasticSearch
中数据的增删改查,避免编写大量的样板代码。
2,由于ElasticSearch
使用json
保存数据,所以需要要在被保存的对象标注转换信息。当添加视频时不仅要将视频信息保存到数据库,还要保存到ElasticSearch
,以便后续查询。
x
1//标示映射到Elasticsearch文档上的领域对象
2// 指示如何将对象转换为文档,指定的索引名称用于es查询,其中的索引类似于mysql中数据库的概念
3indexName = "videos") (
4public class Video {
5 // 主键
6
7 private Long id;
8 //文档类型,mysql中表的概念。常见类型包括:{ Text:会进行分词并建了索引的字符类型 Integer, Long, Date, Float, Double, Boolean, Object, Auto:自动判断字段类型 Nested:嵌套对象类型 }
9 //text类型,可被分词,将查询语句拆分为多个关键词,实现部分匹配,扩大搜索结果范围
10 type = FieldType.Text) (
11 private String title;
12}
3,根据用户输入的关键字,利用ElasticSearch
搜索用户的昵称、视频标题、视频简介,返回匹配的用户和视频,实现全局搜索。
x
1public List<Map<String, Object>> getContents(String keyword,Integer pageNo,Integer pageSize) throws IOException {
2 // 要查询的索引,类似于mysql 中的表,要与Video,UserInfo上定义的索引对应
3 String[] indices = {"videos", "user-infos"};
4 // 构建请求
5 SearchRequest searchRequest = new SearchRequest(indices);
6 // 构造搜索信息来源
7 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
8 //分页
9 sourceBuilder.from(pageNo - 1);
10 sourceBuilder.size(pageSize);
11 // 要查询的字段,用于在指定的索引中查询字段,此处查询的字段为用户昵称、视频标题、视频简介
12 MultiMatchQueryBuilder matchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "title", "nick", "description");
13 sourceBuilder.query(matchQueryBuilder);
14 searchRequest.source(sourceBuilder);
15 sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
16 //执行搜索
17 SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
18 // 查询结果,每个对象对应一个Map,Map中保存<field,value>
19 List<Map<String, Object>> arrayList = new ArrayList<>();
20 for (SearchHit hit : searchResponse.getHits()) {
21 Map<String, Object> sourceMap = hit.getSourceAsMap();
22 arrayList.add(sourceMap);
23 }
24 return arrayList;
25}
4,当搜索关键字为前进
时,搜索到昵称中包含关键字的用户前进的野兽先辈
,和标题中包含关键字的视频前进4Eva
,实现了全局搜索的功能。
x
1[
2 {
3 "_class": "com.imooc.bilibili.domain.UserInfo",
4 "avatar": "",
5 "birth": "1999-10-01",
6 "createTime": "2022-03-20T14:05:01.000Z",
7 "gender": "0",
8 "id": 10,
9 "nick": "前进的野兽先辈",
10 "sign": "",
11 "updateTime": "2022-04-23T04:13:20.124Z",
12 "userId": 26
13 },
14 {
15 "_class": "com.imooc.bilibili.domain.Video",
16 "area": "0",
17 "createTime": "2022-04-23T03:48:50.838Z",
18 "description": "前进4Eva",
19 "duration": "111",
20 "id": 35,
21 "thumbnail": "thumbnail",
22 "title": "前进4Eva",
23 "type": "0",
24 "url": "M00/00/00/rBEABGJZKpCEaoV6AAAAAJUikZg683.mp4",
25 "userId": 26,
26 "videoTagList": [
27 {
28 "createTime": 1650685730838,
29 "tagId": 3,
30 "videoId": 35
31 }
32 ]
33 }
34]