分布式系列教程(38) -SpringBoot基于ES的网盘应用

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 分布式系列教程(38) -SpringBoot基于ES的网盘应用

1. 引言

项目已提交至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringBoot-ES-NetDisk-Demo

网盘搜索原理图:

本文主要做一个迷你版的网盘操作,具体的爬虫获取数据功能就不做了,主要做网盘搜索的功能,演示效果如下:

搜索之后

2. SpringBoot基于ES的网盘应用开发

2.1 数据准备

1.定义文档映射

DELETE /clouddisk
PUT /clouddisk
POST /clouddisk/_mapping/disk
{
        "disk": {
        "properties": {
          "baiduaddres": {
            "type": "keyword"
          },
          "browsetimes": {
            "type": "long"
          },
          "collectiontime": {
            "type": "date"
          },
          "describe": {
            "type": "text",
            "analyzer": "ik_smart"
          },
          "filesize": {
            "type": "float"
          },
          "name": {
            "type": "text",
            "analyzer": "ik_smart"
          },
          "sharpeople": {
            "type": "keyword"
          },
          "shartime": {
            "type": "date"
          },
          "source": {
            "type": "keyword"
          }
        }
      }
}

2.添加数据到ES,数据在项目中有,可以克隆下来看看:

2.2 代码

2.2.1 前端代码

页面实现search.ftl

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>网盘搜索引擎</title>
   <!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- 可选的Bootstrap主题文件(一般不使用) -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap-theme.min.css"></script>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.bootcss.com/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body  style="display: block; margin: 0 auto; width: 50%; " >
      <div style="width:100%;height:60px;" align="center">
           <h2 style="color:#985f0d;">网盘搜索引擎</h2>
      </div>
      <br/>
      <div align="center">
          <span style="font-size: 18px;" >检索出${total}条数据,耗时:${time}毫秒</span>
      </div>
      <br/>
      <br/>
      <div class="bs-example" data-example-id="striped-table">
      <table class="table table-bordered table-hover">
             <thead>
                 <tr>
                     <th style="text-align:center;" scope="row">链接名称</th>
                     <th style="text-align:center;">文件大小GB</th>
                     <th style="text-align:center;">分享人</th>
                      <th style="text-align:center;">云盘地址</th>
                 </tr>
             </thead>
             <tbody>
              <#list page.content as p>
                 <tr >
                     <th style="text-align: left;" >
                      <#if keyword??>
                     ${p.name?replace(keyword, '<span style="color: red">${keyword}</span>')}
                <#else>
             ${p.name}
            </#if>
                     </th>
                     <th style="text-align: center;">${p.filesize}</th>
                     <th style="text-align: center;">${p.sharpeople}</th>
                     <th style="text-align: center;"><a href="${p.baiduaddres}">云盘地址</a> </th>
                </tr>
               </#list> 
             </tbody>
      </table>
      <div style="font-size: 21px;">
            <#list 1..totalPage as i>    
        <#if keyword??>
              <a href="/search?keyword=${keyword}&page=${i-1}" >${i}</a>
             <#else>
                <a href="/search?page=${i-1}" >${i}</a>
           </#if>     
         </#list>
      </div>
      </div>
</body>
</html>

2.2.2 后端代码

1.新建maven项目SpringBoot-ES-NetDisk-Demo

2.添加maven依赖

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.0.0.RELEASE</version>
  <relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
  </dependency>
  <dependency>
    <groupId>com.google.collections</groupId>
    <artifactId>google-collections</artifactId>
    <version>1.0-rc2</version>
  </dependency>
  <!-- springboot整合freemarker -->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
  </dependency>
</dependencies>

3.application信息:

spring:
  data:
    elasticsearch:
      ####集群名称
      cluster-name: myes
      ####地址
      cluster-nodes: 192.168.162.131:9300
  freemarker:
    # 设置模板后缀名
    suffix: .ftl
    # 设置文档类型
    content-type: text/html
    # 设置页面编码格式
    charset: UTF-8
    # 设置页面缓存
    cache: false
    # 设置ftl文件路径
    template-loader-path:
      - classpath:/templates
  # 设置静态文件路径,js,css等
  mvc:
    static-path-pattern: /static/**

4.实体类层

@Document(indexName = "clouddisk", type = "disk")
public class CloudDiskEntity {
    private String id;
    // 名称
    private String name;
    // 来源
    private String source;
    // 描述
    private String describe;
    // 分享时间
    private Date shartime;
    // 浏览次数
    private Long browsetimes;
    // 文件大小
    private Double filesize;
    // 分享人
    private String sharpeople;
    // 收录时间
    private String collectiontime;
    // 地址
    private String baiduaddres;
  //getter and setter...

5.repository层

public interface CloudDiskDao extends ElasticsearchRepository<CloudDiskEntity, String> {
}

6.控制层

import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class CloudDiskController {
    @Autowired
    private CloudDiskDao cloudDiskDao;
    @RequestMapping("/search")
    public String search(String keyword, @PageableDefault(page = 0, value = 6) Pageable pageable,
                         HttpServletRequest req) {
        Long startTime = System.currentTimeMillis();
        // 查询所有的
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        if (!StringUtils.isEmpty(keyword)) {
            // 模糊查询 一定要ik中文
            MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", keyword);
            boolQuery.must(matchQuery);
        }
        Page<CloudDiskEntity> page = cloudDiskDao.search(boolQuery, pageable);
        req.setAttribute("page", page);
        // 计算查询总数
        long total = page.getTotalElements();
        req.setAttribute("total", page.getTotalElements());
        // 计算分页数
        int totalPage = (int) ((total - 1) / pageable.getPageSize() + 1);
        req.setAttribute("totalPage", totalPage);
        Long endTime = System.currentTimeMillis();
        // 计算程序的耗时时间
        req.setAttribute("time", endTime - startTime);
        req.setAttribute("keyword", keyword);
        return "search";
    }
}

7.启动类:

@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.ylw.springboot.es")
public class AppEs {
  public static void main(String[] args) {
    SpringApplication.run(AppEs.class, args);
  }
}

2.2 启动测试

浏览器输入http://localhost:8080/search,可以看到网盘列表:

现在搜索卡卡西:http://localhost:8080/search?keyword=卡卡西,可以看到30ms就搜索出来了。

目录
相关文章
|
1天前
|
安全 大数据 Go
Go语言在分布式系统中的应用
【2月更文挑战第20天】Go语言,以其独特的语言特性和出色的性能,逐渐成为分布式系统开发领域的热门选择。本文将深入探讨Go语言在分布式系统中的应用,分析其优势及实际应用案例,旨在为开发人员提供有价值的参考与启示。
|
1天前
|
Java 编译器 数据库
Spring Boot 整合 redisson 实现分布式锁
Spring Boot 整合 redisson 实现分布式锁
31 1
|
1天前
|
Kubernetes Java 容器
部署 Spring Boot 应用到 K8S 教程
部署 Spring Boot 应用到 K8S 教程
68 0
|
1天前
|
缓存 NoSQL Java
分布式项目中锁的应用(本地锁-_redis【setnx】-_redisson-_springcache)-fen-bu-shi-xiang-mu-zhong-suo-de-ying-yong--ben-de-suo--redissetnx-springcache-redisson(一)
分布式项目中锁的应用(本地锁-_redis【setnx】-_redisson-_springcache)-fen-bu-shi-xiang-mu-zhong-suo-de-ying-yong--ben-de-suo--redissetnx-springcache-redisson
62 0
|
1天前
|
Java 关系型数据库 MySQL
保姆级教程——将springboot项目部署到阿里云服务器包含环境配置(小白包会)
本文档详细介绍了将SpringBoot项目部署到阿里云服务器的步骤。首先,通过Xshell连接服务器,使用公网IP地址。接着,下载JDK的Linux版本,使用XFTP上传并解压,配置环境变量。然后,安装MySQL 5.7,包括下载YUM源、安装、启动服务以及修改root密码和开启远程访问。最后,将SpringBoot项目打包成jar,上传至服务器,使用`java -jar`命令运行,通过`nohup`确保服务持续运行。配置安全组以允许远程访问。
|
1天前
|
分布式计算 负载均衡 Java
构建高可用性Java应用:介绍分布式系统设计与开发
构建高可用性Java应用:介绍分布式系统设计与开发
12 0
|
1天前
Springboot-Jedis实现分布式锁
Springboot-Jedis实现分布式锁
11 0
|
1天前
|
编解码 NoSQL Java
Springboot框架使用redisson实现分布式锁
Redisson是官方推荐的Java Redis客户端,提供丰富的功能,包括默认的分布式锁支持。它可以无缝替代Spring Boot 2.x的Letture客户端,不影响原有RedisTemplate和Redis Repository的使用。集成包括spring-boot-starter-data-redis和redisson-spring-boot-starter,后者需排除默认的redisson-spring-data-23以匹配Spring Data Redis v.2.2.x。
|
1天前
|
存储 供应链 安全
区块链技术原理及应用:深入探索分布式账本技术
【4月更文挑战第30天】区块链,从加密货币的底层技术延伸至多元领域,以其分布式账本、去中心化、不可篡改性及加密技术重塑数据存储与交易。核心组件包括区块、链和节点,应用涵盖加密货币、供应链管理、金融服务等。尽管面临扩展性等挑战,未来潜力无限。
|
1天前
|
消息中间件 人工智能 Java
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
27 1