博客
关于我
ElasticSearch的综合实战
阅读量:612 次
发布时间:2019-03-13

本文共 8551 字,大约阅读时间需要 28 分钟。

ElasticSearch的综合实战

一、爬虫

上JD进行搜索java 复制链接https://search.jd.com/Search?keyword=java&enc=utf-8

在这里插入图片描述

F12进行查看书籍在那个div下

在这里插入图片描述

每本书下个信息

在这里插入图片描述

导入jsoup依赖

org.jsoup
jsoup
1.13.1
com.alibaba
fastjson
1.2.75

创建utils包并建立HtmlParseUtil.java爬取测试

//测试数据public static void main(String[] args) throws IOException, InterruptedException {   	//获取请求    String url = "https://search.jd.com/Search?keyword=java";	// 解析网页 (Jsou返回的Document就是浏览器的Docuement对象)    Document document = Jsoup.parse(new URL(url), 30000);    //获取id,所有在js里面使用的方法在这里都可以使用    Element element = document.getElementById("J_goodsList");    //获取所有的li元素    Elements elements = element.getElementsByTag("li");    //用来计数    int c = 0;    //获取元素中的内容  ,这里的el就是每一个li标签    for (Element el : elements) {           c++;        //这里有一点要注意,直接attr使用src是爬不出来的,因为京东使用了img懒加载        String img = el.getElementsByTag("img").eq(0).attr("data-lazy-img");        //获取商品的价格,并且只获取第一个text文本内容        String price = el.getElementsByClass("p-price").eq(0).text();        String title = el.getElementsByClass("p-name").eq(0).text();        String shopName = el.getElementsByClass("p-shop").eq(0).text();        System.out.println("========================================");        System.out.println(img);        System.out.println(price);        System.out.println(title);        System.out.println(shopName);    }    System.out.println(c);}

测试结果

在这里插入图片描述
获取结果没有问题后,将此方法封装为一个工具类使用

创建pojo实体类

Content.javaimport lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Content {       private String title;    private String img;    private String price;    //可以自行添加属性}

封装工具类

HtmlParseUtils.java

@Componentpublic class HtmlParseUtil {   //    public static void main(String[] args) throws IOException {   //        new HtmlParseUtil().parseJD("Java").forEach(System.out::println);//    }    public List
parseJD(String keywords) throws IOException { //获取请求 https://search.jd.com/Search?keyword=java&enc=utf-8 //前提需要连网 String url = "https://search.jd.com/Search?keyword=" + keywords + "&enc=utf-8"; //解析网页 (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
goodList = new ArrayList<>(); //通过元素中的内容,这里el就是每一个li标签了 for (Element el : elements) { //加if判断是为了 过滤空标签 if (el.attr("class").equalsIgnoreCase("gl-item")) { //关于这种图片特别多的网页,所有的图片都是延迟加载的 //在jd搜索后f12可以看到存放在data-lazy-img中 String img = el.getElementsByTag("img").eq(0).attr("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.setImg(img); content.setPrice(price); content.setTitle(title); goodList.add(content); } } return goodList; }}

编写业务层代码,去掉接口

ContentService.java

首先完成一个方法让爬取的数据存入ES中

//业务编写@Servicepublic class ContentService {   		//将客户端注入    @Autowired    @Qualifier("restHighLevelClient")    private RestHighLevelClient client;    //1、解析数据放到 es 中    public boolean parseContent(String keyword) throws IOException {           List
contents = new HtmlParseUtil().parseJD(keyword); //把查询的数据放入 es 中 BulkRequest request = new BulkRequest(); request.timeout("2m"); for (int i = 0; i < contents.size(); i++) { request.add( new IndexRequest("jd_goods") .source(JSON.toJSONString(contents.get(i)), XContentType.JSON)); } BulkResponse bulk = client.bulk(request, RequestOptions.DEFAULT); return !bulk.hasFailures(); }}

在Controller包下建立

ContentController.java

//请求编写@RestControllerpublic class ContentController {       @Autowired    private ContentService contentService;    @GetMapping("/parse/{keyword}")    public Boolean parse(@PathVariable("keyword") String keyword) throws IOException {           return contentService.parseContent(keyword);    }}

启动Springboot项目,访问是否能将数据爬取至ES

在这里插入图片描述
在这里插入图片描述
实现搜索功能
在ContentService.java中添加

//2、获取这些数据实现基本的搜索功能public List
> searchPage(String keyword, int pageNo, int pageSize) throws IOException { if (pageNo <= 1) { pageNo = 1; } if (pageSize <= 1) { pageSize = 1; } //条件搜索 SearchRequest searchRequest = new SearchRequest("jd_goods"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //分页 sourceBuilder.from(pageNo).size(pageSize); //精准匹配 TermQueryBuilder termQuery = QueryBuilders.termQuery("title", keyword); sourceBuilder.query(termQuery); sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); //执行搜索 SearchRequest source = searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //解析结果 List
> list = new ArrayList<>(); for (SearchHit documentFields : searchResponse.getHits().getHits()) { list.add(documentFields.getSourceAsMap()); } return list;}

在ContentController.java中添加搜索请求,使用RestFul

@GetMapping("/search/{keyword}/{pageNo}/{pageSize}")public List
> search(@PathVariable("keyword") String keyword, @PathVariable("pageNo") int pageNo, @PathVariable("pageSize") int pageSize) throws IOException { List
> list = contentService.searchPage(keyword, pageNo, pageSize); return list;}

访问访问http://localhost:9090/search/java/1/20 (查询Java 并从第一条显示到第二十条)

在这里插入图片描述
到此数据的爬取和搜索都没有问题了,下面就要开始前后端的分离工作了

二、前后端分离

首先导入准备好的资源 并把axios,jquery,vue的js包导入

在这里插入图片描述
前端需要接受数据

用vue接受数据

在这里插入图片描述

然后为按钮绑定点击事件与搜索绑定

在这里插入图片描述
用vue给前端传递数据
在这里插入图片描述
访问localhost:9090 搜索java进行尝试
在这里插入图片描述

三、搜索高亮

修改ContentService.java中的搜索功能

//3、获取这些数据实现基本的搜索高亮功能public List
> searchPagehighlighter(String keyword, int pageNo, int pageSize) throws IOException { if (pageNo <= 1) { pageNo = 1; } if (pageSize <= 1) { pageSize = 1; } //条件搜索 SearchRequest searchRequest = new SearchRequest("jd_goods"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //分页 sourceBuilder.from(pageNo).size(pageSize); //精准匹配 TermQueryBuilder termQuery = QueryBuilders.termQuery("title", keyword); //==================================== 高 亮 ========================================== HighlightBuilder highlightBuilder = new HighlightBuilder(); //获取高亮构造器 highlightBuilder.field("title"); //需要高亮的字段 highlightBuilder.requireFieldMatch(false);//不需要多个字段高亮 highlightBuilder.preTags("
"); //前缀 highlightBuilder.postTags(""); //后缀 sourceBuilder.highlighter(highlightBuilder); //把高亮构造器放入sourceBuilder中 sourceBuilder.query(termQuery); sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); //执行搜索 SearchRequest source = searchRequest.source(sourceBuilder); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); //解析结果 List
> list = new ArrayList<>(); for (SearchHit hit : searchResponse.getHits().getHits()) { Map
highlightFields = hit.getHighlightFields();//获取高亮字段 HighlightField title = highlightFields.get("title"); //得到我们需要高亮的字段 Map
sourceAsMap = hit.getSourceAsMap();//原来的返回的结果 //解析高亮的字段 if (title != null) { Text[] fragments = title.fragments(); String new_title = ""; for (Text text : fragments) { new_title += text; } sourceAsMap.put("title", new_title); //高亮字段替换掉原来的内容即可 } list.add(sourceAsMap); } return list;}

改变Controller中的搜索请求后进行尝试

@GetMapping("/search/{keyword}/{pageNo}/{pageSize}")public List
> search(@PathVariable("keyword") String keyword, @PathVariable("pageNo") int pageNo, @PathVariable("pageSize") int pageSize) throws IOException { List
> list = contentService.searchPagehighlighter(keyword, pageNo, pageSize); return list;}

访问尝试

在这里插入图片描述

ok完成

在这里插入图片描述

转载地址:http://bzkaz.baihongyu.com/

你可能感兴趣的文章
mariadb multi-source replication(mariadb多主复制)
查看>>
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
MFC模态对话框和非模态对话框
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>