前言
本次除了简单的整合外,还实现一个网盘搜索引擎的例子。
项目目录如下
需要先用kibana向es添加测试数据
DELETE indextest
PUT indextest
POST /indextest/_mapping/disk
{
"disk":{
"properties":{
"name":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"source":{
"type":"keyword"
},
"describe":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"shartime":{
"type":"date"
},
"browsetimes":{
"type":"long"
},
"filesize":{
"type":"float"
},
"sharpeople":{
"type":"keyword"
},
"collectiontime":{
"type":"date"
},
"baiduaddres":{
"type":"keyword"
}
}
}
}
POST /indextest/disk
{
"name": "2019史上最全SpringBoot",
"source": "百度云盘",
"describe": "全网独一份",
"shartime": "2019-10-01",
"browsetimes": 100000,
"filesize": 4.35,
"sharpeople": "lhw123",
"collectiontime": "2019-10-02",
"baiduaddres": "https://pan.baidu.com/s/asdasd"
}
POST /indextest/disk
{
"name": "2019史上最全SpringCloud",
"source": "百度云盘",
"describe": "还挺好",
"shartime": "2019-10-01",
"browsetimes": 100000,
"filesize": 6.35,
"sharpeople": "lhw644",
"collectiontime": "2019-10-02",
"baiduaddres": "https://pan.baidu.com/s/asdasd"
}
POST /indextest/disk
{
"name": "SpringBoot整合SSM课程",
"source": "百度云盘",
"describe": "还挺好",
"shartime": "2019-10-01",
"browsetimes": 100000,
"filesize": 1.35,
"sharpeople": "lhw644",
"collectiontime": "2019-10-02",
"baiduaddres": "https://pan.baidu.com/s/asdasd"
}
POST /indextest/disk
{
"name": "SpringCloud视频教程",
"source": "百度云盘",
"describe": "强烈推荐",
"shartime": "2019-10-01",
"browsetimes": 100000,
"filesize": 1.35,
"sharpeople": "lhw444",
"collectiontime": "2019-10-02",
"baiduaddres": "https://pan.baidu.com/s/asdasd"
}
POST /indextest/disk
{
"name": "spring纯手写源码视频教程",
"source": "百度云盘",
"describe": "666",
"shartime": "2019-10-01",
"browsetimes": 100000,
"filesize": 1.35,
"sharpeople": "lhw456",
"collectiontime": "2019-10-02",
"baiduaddres": "https://pan.baidu.com/s/asdasd"
}
实践
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<groupId>com.example</groupId>
<artifactId>estest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>estest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置文件application.yml
spring:
data:
elasticsearch:
####集群名称
cluster-name: myes
####地址
cluster-nodes: 192.168.0.108: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/**
server:
port: 80
实体类
package com.example.estest;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.util.Date;
@Data
@Document(indexName = "indextest",type = "disk")
public class CloudDiskEntity {
@Id
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; //地址
}
dao类
package com.example.estest;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface CloudDiskDao extends ElasticsearchRepository<CloudDiskEntity,String> {
}
controller类
package com.example.estest;
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.util.StringUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
@Controller
public class CloudDiskController {
@Autowired
private CloudDiskDao cloudDiskDao;
/**
* 根据id查询文档
* @return
*/
@RequestMapping("/findById/{id}")
@ResponseBody
public Optional<CloudDiskEntity> findById(@PathVariable String id){
return cloudDiskDao.findById(id);
}
@RequestMapping("/search")
public String search(String keyword, String describe, @PageableDefault(page = 0,value = 5)Pageable pageable,
HttpServletRequest request){
Long startTime = System.currentTimeMillis();
//创建查询对象
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//构建查询条件
if(!StringUtils.isEmpty(keyword)){
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name",keyword);
boolQueryBuilder.must(matchQueryBuilder);
}
if(!StringUtils.isEmpty(describe)){
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("describe",describe);
boolQueryBuilder.must(matchQueryBuilder);
}
//调用查询接口
Page<CloudDiskEntity> page = cloudDiskDao.search(boolQueryBuilder,pageable);
request.setAttribute("page",page);
//记录总数
request.setAttribute("total",page.getTotalElements());
request.setAttribute("totalPage",page.getTotalElements());
request.setAttribute("keyword",keyword);
Long endTime = System.currentTimeMillis();
request.setAttribute("time",endTime-startTime);
//将迭代器转换为集合
return "search";
}
}
前端页面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>
运行项目
用浏览器访问http://127.0.0.1:8080/search
在地址上添加查询条件