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

网址建站模板免费网站建设

网址建站,模板免费网站建设,Wordpress pay plugin,做营销网站seo【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版 一、Elasticsearch基础介绍 Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索和分析引擎,基于Apache Lucene构建。在视频平台中,它主要用于: 全…

【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版

一、Elasticsearch基础介绍

Elasticsearch(简称ES)是一个分布式、RESTful风格的搜索和分析引擎,基于Apache Lucene构建。在视频平台中,它主要用于:

  1. 全文搜索:快速检索视频标题、标签等内容
  2. 结构化查询:支持多种条件组合查询
  3. 高亮显示:突出显示匹配的关键词
  4. 聚合统计:对播放量、弹幕数等进行统计分析

核心特性

近实时搜索:数据变更后1秒内可搜索
分布式架构:支持水平扩展
丰富的API:RESTful接口和多种客户端
强大的查询DSL:灵活的查询语法

二、组件配置解析

@Value("${es.host.port:127.0.0.1:9200}")
private String esHostPort;@Value("${es.index.video.name:easylive_video}")
private String esIndexVideoName;

esHostPort:ES服务器地址,默认本地9200端口
esIndexVideoName:视频索引名称,默认"easylive_video"

三、核心方法详解

1. 索引初始化方法 createIndex()

public void createIndex() {try {// 检查索引是否存在Boolean existIndex = isExistIndex();if (existIndex) {return;}// 创建索引请求CreateIndexRequest request = new CreateIndexRequest(appConfig.getEsIndexVideoName());// 设置分析器(处理逗号分隔的标签)request.settings("{\"analysis\": {\"analyzer\": {\"comma\": {\"type\": \"pattern\",\"pattern\": \",\"}}}}", XContentType.JSON);// 定义字段映射request.mapping("{\"properties\": {...}}", XContentType.JSON);// 执行创建CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);if (!response.isAcknowledged()) {throw new BusinessException("初始化es失败");}} catch (Exception e) {log.error("初始化es失败", e);throw new BusinessException("初始化es失败");}
}

字段映射说明
videoId/userId:仅存储不索引
videoName:使用ik中文分词器
tags:使用自定义逗号分析器
• 数值/日期字段:仅存储不索引

2. 文档操作方法

(1) 保存文档 saveDoc()
public void saveDoc(VideoInfo videoInfo) {try {// 存在则更新,不存在则新增if (docExist(videoInfo.getVideoId())) {updateDoc(videoInfo);} else {VideoInfoEsDto dto = CopyTools.copy(videoInfo, VideoInfoEsDto.class);// 初始化统计字段dto.setCollectCount(0);dto.setPlayCount(0);dto.setDanmuCount(0);IndexRequest request = new IndexRequest(appConfig.getEsIndexVideoName());request.id(videoInfo.getVideoId()).source(JsonUtils.convertObj2Json(dto), XContentType.JSON);restHighLevelClient.index(request, RequestOptions.DEFAULT);}} catch (Exception e) {log.error("新增视频到es失败", e);throw new BusinessException("保存失败");}
}
(2) 更新文档 updateDoc()
private void updateDoc(VideoInfo videoInfo) {try {// 排除时间字段videoInfo.setLastUpdateTime(null);videoInfo.setCreateTime(null);// 反射获取非空字段Map<String, Object> dataMap = new HashMap<>();Field[] fields = videoInfo.getClass().getDeclaredFields();for (Field field : fields) {Method getter = videoInfo.getClass().getMethod("get" + StringTools.upperCaseFirstLetter(field.getName()));Object value = getter.invoke(videoInfo);if (value != null && !(value instanceof String && ((String)value).isEmpty())) {dataMap.put(field.getName(), value);}}if (!dataMap.isEmpty()) {UpdateRequest updateRequest = new UpdateRequest(appConfig.getEsIndexVideoName(), videoInfo.getVideoId());updateRequest.doc(dataMap);restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);}} catch (Exception e) {log.error("更新视频到es失败", e);throw new BusinessException("保存失败");}
}
(3) 更新统计字段 updateDocCount()
public void updateDocCount(String videoId, String fieldName, Integer count) {try {// 使用painless脚本实现原子递增UpdateRequest updateRequest = new UpdateRequest(appConfig.getEsIndexVideoName(), videoId);Script script = new Script(ScriptType.INLINE, "painless", "ctx._source." + fieldName + " += params.count", Collections.singletonMap("count", count));updateRequest.script(script);restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);} catch (Exception e) {log.error("更新数量到es失败", e);throw new BusinessException("保存失败");}
}
(4) 删除文档 delDoc()
public void delDoc(String videoId) {try {DeleteRequest deleteRequest = new DeleteRequest(appConfig.getEsIndexVideoName(), videoId);restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);} catch (Exception e) {log.error("从es删除视频失败", e);throw new BusinessException("删除视频失败");}
}

3. 搜索方法 search()

public PaginationResultVO<VideoInfo> search(Boolean highlight, String keyword, Integer orderType, Integer pageNo, Integer pageSize) {try {// 1. 构建搜索请求SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 2. 设置查询条件(多字段匹配)sourceBuilder.query(QueryBuilders.multiMatchQuery(keyword, "videoName", "tags"));// 3. 设置高亮if (highlight) {HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("videoName").preTags("<span class='highlight'>").postTags("</span>");sourceBuilder.highlighter(highlightBuilder);}// 4. 设置排序SearchOrderTypeEnum orderEnum = SearchOrderTypeEnum.getByType(orderType);if (orderType != null) {sourceBuilder.sort(orderEnum.getField(), SortOrder.DESC);} else {sourceBuilder.sort("_score", SortOrder.DESC); // 默认按相关度排序}// 5. 设置分页pageNo = pageNo == null ? 1 : pageNo;pageSize = pageSize == null ? PageSize.SIZE20.getSize() : pageSize;sourceBuilder.from((pageNo - 1) * pageSize).size(pageSize);// 6. 执行查询SearchRequest searchRequest = new SearchRequest(appConfig.getEsIndexVideoName());searchRequest.source(sourceBuilder);SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);// 7. 处理结果SearchHits hits = response.getHits();List<VideoInfo> videoList = Arrays.stream(hits.getHits()).map(hit -> {VideoInfo info = JsonUtils.convertJson2Obj(hit.getSourceAsString(), VideoInfo.class);// 应用高亮if (hit.getHighlightFields().get("videoName") != null) {info.setVideoName(hit.getHighlightFields().get("videoName").getFragments()[0].string());}return info;}).collect(Collectors.toList());// 8. 补充用户信息Map<String, UserInfo> userMap = userInfoMapper.selectList(new UserInfoQuery().setUserIdList(videoList.stream().map(VideoInfo::getUserId).collect(Collectors.toList()))).stream().collect(Collectors.toMap(UserInfo::getUserId, Function.identity()));videoList.forEach(video -> {UserInfo user = userMap.get(video.getUserId());if (user != null) video.setNickName(user.getNickName());});// 9. 返回分页结果return new PaginationResultVO<>((int)hits.getTotalHits().value,pageSize,pageNo,(int)Math.ceil((double)hits.getTotalHits().value / pageSize),videoList);} catch (Exception e) {log.error("查询视频失败", e);throw new BusinessException("查询失败");}
}

四、设计亮点分析

  1. 优雅的异常处理
    • 统一捕获异常并转换为业务异常
    • 记录详细错误日志

  2. 智能的文档操作
    • 自动判断文档存在性
    • 增量更新非空字段

  3. 高效的统计更新
    • 使用painless脚本实现原子操作

  4. 完整的分页支持
    • 支持自定义页码和大小
    • 返回总页数等元信息

  5. 关联数据补充
    • 搜索后批量查询用户信息
    • 减少N+1查询问题

五、潜在优化建议

  1. 批量操作支持

    BulkRequest bulkRequest = new BulkRequest();
    // 添加多个操作
    restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    
  2. 缓存用户信息
    • 使用Redis缓存频繁访问的用户数据

  3. 搜索建议功能

    SearchSourceBuilder.suggest(new SuggestBuilder().addSuggestion("video-suggest", SuggestBuilders.completionSuggestion("videoName.suggest")));
    
  4. 更复杂的高亮策略
    • 支持多字段高亮
    • 自定义高亮片段长度

  5. 索引别名支持
    • 使用别名实现零停机索引重建

六、初始化流程(InitRun)

@Component("initRun")
public class InitRun implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {// 1. 测试数据库连接try (Connection conn = dataSource.getConnection()) {// 2. 测试Redis连接redisUtils.get("test");// 3. 初始化ES索引esSearchComponent.createIndex();logger.info("服务启动成功");} catch (Exception e) {logger.error("服务启动失败", e);System.exit(0); // 启动失败直接退出}}
}

启动验证逻辑

  1. 数据库连接测试
  2. Redis连通性测试
  3. ES索引初始化
  4. 任一失败则终止应用启动

这个ES搜索组件为视频平台提供了完整、高效的搜索能力,从基础索引管理到复杂的搜索功能都有良好实现,是系统核心功能的重要支撑。

http://www.dtcms.com/wzjs/488889.html

相关文章:

  • 济南 网站建设seo关键词如何设置
  • 新乡建设企业网站三台网站seo
  • 义务 网站建设互联网营销培训
  • 网站建设服务有哪些内容网页制作工具有哪些
  • 邯郸做移动网站的公司佛山网站建设制作
  • 宜春网站建设哪家专业网站开发技术
  • 交友小程序开发googleseo排名公司
  • 南京黑马程序员培训学校官网优化包括什么内容
  • 网络课程系统网站建设费用广告软文范例200字
  • 创意产品网站百度数据指数
  • 网站开发做原型吗百度软件
  • 阜阳公司做网站南宁百度首页优化
  • 尚义住房和城乡规划建设局网站精准客源推广引流
  • 医美网站建设东莞网络排名优化
  • wordpress 文章封面seo优化关键词0
  • 做网站建设还有钱赚吗百度免费咨询
  • 用wix做外贸网站网站seo思路
  • 阿里云服务器上做网站seo发帖工具
  • 福建网站建设公司seo门户网站
  • 做营销网站制作搜索引擎广告形式有
  • 网站建设 南昌招标百度seo运营工作内容
  • 网站建设推广优化域名检测工具
  • 大气装饰公司网站源码友谊平台
  • 微网站工程案例展示企业营销策划书范文
  • 网上做兼职正规网站有哪些免费关键词搜索引擎工具
  • 企业邮箱怎么使用seo网站内容优化
  • 深圳皇冠科技有限公司网站网站建设是什么工作
  • 如何使用爱站网seo内链优化
  • 长春做网站推广西安百度竞价代运营
  • 创建网站的网站郑州seo询搜点网络效果佳