ElasticSearch仿京东搜索实战
项目介绍
此项目是跟随狂神ES课程入门所做的SpringBoot+ES+Vue实战项目,在视频的基础上,已实现前后端分离。功能比较简单,实现的基本的爬取+储存+搜索+高亮,
此项目涉及以下功能
- ES创建索引
- ES删除索引
- ES批量插入文档
- ES查询并高亮显示
- 最基础的JAVA爬虫(Jsoup)
- Vue基本操作
运行环境
- ElasticSearch 7.6.1
- IDEA 2021.2
- Maven 3.6.1
- SpringBoot 2.5.4
前期准备
- 安装ElasticSearch、Kibana、ik分词器,注意这三个版本必须保持一致!
开发步骤
1.创建spring boot项目
2.配置文件
server.port=9090
# 关闭thymeleaf缓存
spring.thymeleaf.cache=false
3.导入静态资源
4.编写controller
package com.example.jdes.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
@GetMapping({
"/", "/index"})
public String index() {
return "index";
}
}
5.测试是否成功
http://localhost:9090/
爬虫爬取数据
获取网页返回的信息即可得到数据
导入jsoup
依赖
用来解析网页,如果想解析电影需要使用tika包
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
把需要解析得到的内容封装在content对象中
package com.example.jdes.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Content {
private String title;
private String img;
private String price;
}
编写解析网页工具类
package com.example.jdes.utils;
import com.example.jdes.entity.Content;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.stereotype.Component;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
@Component
public class HtmlParseUtil {
public List<Content> parseJD(String keywords) throws Exception {
//获取请求
String url = "https://search.jd.com/Search?keyword=" + keywords;
//解析网页。(Jsoup返回Document就是浏览器Document对象)
Document document = Jsoup.parse(new URL(url), 30000);
//所有你在js中可以使用的方法,这里都能用
Element element = document.getElementById("J_goodsList");
//获取所有的li元素
Elements elements = element.getElementsByTag("li");
ArrayList<Content> goodsList = new ArrayList<>();
//获取元素中的内容,这里el 就是每一个li标签了
for (Element el : elements) {
//关于这种图片特别多的网站,所有的图片都是延迟加载的
String img = el.getElementsByTag("img").eq(0).attr("source-data-lazy-img");
String price = el.getElementsByClass("p-price").eq(0).text();
String title = el.getElementsByClass("p-name").eq(0).text();
Content content = new Content();
content.setTitle(title);
content.setImg(img);
content.setPrice(price);
goodsList.add(content);
}
return goodsList;
}
}
正式开发
编写controller
// 请求编写
@RestController
public class ContentController {
@Autowired
private ContentService contentService;
@GetMapping("/parse/{keyword}")
public boolean parse(@PathVariable("keyword")String keyword) throws Exception {