SpringBoot整合Elasticsearch

SpringBoot整合ES

SpringBoot整合ES实现网盘搜索引擎

项目环境搭建
数据结构分析

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"
          }
        }
      }
  
}

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>

application信息

spring:
  data:
    elasticsearch:
    ####集群名称
     cluster-name: myes
    ####地址 
     cluster-nodes: 192.168.212.180: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/**

三层结构

实体类层

@Data
@Document(indexName = "clouddisk", type = "disk")
public class CloudDiskEntity {
	/**
	 * { "name": "2018史上最全SpringBoot", "source": "百度云盘", "describe":
	 * "2018史上最全的SpringBoot课程", "shartime": "2018-10-10", "browsetimes": 10,
	 * "filesize": 4.35, "sharpeople": "余胜军644", "collectiontime": "2018-11-24",
	 * "addres": "address"
	 * 
	 * }
	 * 
	 */
	@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;

}

repository层

public interface CloudDiskDao extends ElasticsearchRepository<CloudDiskEntity, String> {

}

控制层

@RestController
public class CloudDiskController {
	@Autowired
	private CloudDiskDao cloudDiskDao;

	// springboot 整合 es 查询
	// 根据id查询文档信息
	@RequestMapping("/findById/{id}")
	public Optional<CloudDiskEntity> findById(@PathVariable String id) {
		return cloudDiskDao.findById(id);

	}

	// 实现分页查询
	@RequestMapping("/search")
	public List<CloudDiskEntity> search(String name, String describe,
			@PageableDefault(page = 0, value = 2) Pageable pageable) {
		// 1.创建查询对象
		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
		if (!StringUtils.isEmpty(name)) {
			MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", name);
			boolQuery.must(matchQuery);
		}
		if (!StringUtils.isEmpty(describe)) {
			MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("describe", describe);
			boolQuery.must(matchQuery);
		}
		// 2.调用查询接口
		Iterable<CloudDiskEntity> search = cloudDiskDao.search(boolQuery, pageable);
		// 3.将迭代器转换为集合
		return Lists.newArrayList(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>
@RestController
public class SearchController {
	@Autowired
	private CloudDiskDao cloudDiskDao;

	@RequestMapping("/search")
	public String search(String keyword, String describe, @PageableDefault(page = 0, value = 5) Pageable pageable,
			HttpServletRequest req) {
		Long startTime = System.currentTimeMillis();
		// 1.创建查询对象
		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
		if (!StringUtils.isEmpty(keyword)) {
			MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("name", keyword);
			boolQuery.must(matchQuery);
		}
		if (!StringUtils.isEmpty(describe)) {
			MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("describe", describe);
			boolQuery.must(matchQuery);
		}
		// 2.调用查询接口
		Page<CloudDiskEntity> page = cloudDiskDao.search(boolQuery, pageable);

		req.setAttribute("page", page);
		// 记录总数
		req.setAttribute("total", page.getTotalElements());
		req.setAttribute("keyword", keyword);
		// 计算分页总数
		int totalPage = (int) ((page.getTotalElements() - 1) / pageable.getPageSize() + 1);
		// 分页总数
		req.setAttribute("totalPage", totalPage);
		Long emdTime = System.currentTimeMillis();
		req.setAttribute("time", emdTime - startTime);
		return "search";
	}

}

访问链接

http://127.0.0.1:8080/findById/J9LfRmcBJUiOjXccw4Zp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值