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中数据库的概念3(indexName = "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": 2613 },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": 3531 }32 ]33 }34]