鱼皮聚合搜索项目笔记+收获
一、收获:
1、使用AXIOS向后端发送请求语法:
myAxios.post("search/all", query).then((res: any) => {}
post请求方式 search/all请求后端的路径 query请求的参数 res响应回来的数据
2、爬虫,如何爬虫:
方法:HttpClient、OKHttp、RestTemplate、HuTool
本项目使用hutool进行爬虫。
a、引入HuTool的依赖
b、示例代码:
if("".equals(searchText) || searchText == null){
url = String.format("https://cn.bing.com/images/search?q=null&form=IQFRBA&id=77" +
"B5251F2BB54280F4E1360130B1FECD4CF816E7&first=%s", current);
}else {
url = String.format("https://cn.bing.com/images/search?q=%s&form=IQFRBA&id=77" +
"B5251F2BB54280F4E1360130B1FECD4CF816E7&first=%s", searchText, current);
}
try{
doc = Jsoup.connect(url).get();
}catch (IOException e){
throw new BusinessException(ErrorCode.PARAMS_ERROR,"数据获取异常");
}
Elements elements = doc.select(".iuscp.isv");
/* log(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");*/
for (Element element : elements) {
String m = element.select(".iusc").get(0).attr("m");
String title = element.select(".inflnk").get(0).attr("aria-label");
Map<String,Object> map = JSONUtil.toBean(m, Map.class);
String murl =(String) map.get("murl");
Picture picture = new Picture();
picture.setTitle(title);
picture.setUrl(murl);
pictures.add(picture);
if(pictures.size() > pageSize){
break;
}
}
3、统一接口,定制统一的数据源接入规范,方便其他人调用,这里讲到门面模式、适配器模式、注册器模式
a、门面模式:相当于生活中的酒店前台,在前台处分配具体的房间号。前台传一个type,根据type类型去掉不同的接口。
b、注册器模式主要解决if else的问题,解决代码冗余问题。抽取一个枚举类,用for循环来代替
if (ObjectUtils.isEmpty(value)) {
return null;
}
for (SearchTypeEnum anEnum : SearchTypeEnum.values()) {
if (anEnum.value.equals(value)) {
return anEnum;
}
}
return null;
c、适配器模式:通过转换,让两个系统能够完成对接。
4、Elastic Search 技术栈:
Logstash:从多个采集器或数据源来抽取/转换数据,向es输送 启动命令 bin目录下 cmd -- logstash.bat -f ..\config\mytask.conf mytask.conf 为config下新建的配置文件。
elasticsearch:存储、查询数据 启动命令 bin目录下 cmd -- elasticsearch.bat
kibana:可视化es数据。启动命令,bin目录下 cmd --kibana
二、遇到的问题
1、后台用es的ElasticsearchRestTemplate类的search方法,查不到数据,因为索引搞错。
2、其他忘记了。。。
三、笔记
1、前端开发:用url 记录页面搜索状态,当用户刷新页面时,能够从url还原之前的搜索状态
url <=>页面状态
将双向变单向
2、整合axios:就是前端向后端发起请求获取数据的库。
3、获取不同类型的数据源
a.文章 内部 爬虫技术 要入库,离线抓取
b.用户 内部
c.图片 外部 实时抓取 我们网站不存 用户搜索的时候从别的网站拿过来。要做个适配。
4、数据抓取的方式 使用hutool
a.直接访问数据接口
b.等网页渲染出明文内容,从前端页面内容抓取
c.点按钮才显示数据时,用无头浏览器:selenium、node.js puppeter
5、获取到html文档,然后从中解析出需要的字段。 jsoup
浏览器同一时间内只允许发送六个请求多了要排队
6、聚合接口
a.用一个接口请求完所有的数据
b.前端传什么固定,后端对参数统一处理
c.通过不同的参数区别不同的数据
7、聚合接口优化
怎么能一次搜索出所有数据,又能分别获取某一类数据。
数据同步 、Elastic Stack(搜索引擎)
门面模式:多个客户端请求 facade ,facade帮助做计算返回给前端。当调用系统的客户端觉得麻烦的时候,应该思考抽象一个门面。
适配器模式:if else多的时候,定制统一数据源规范标准,满足的要求,
任何接入我们系统的数据 要能关键词搜索 要分页搜索。
规范:通过声明接口来定义规范。
泛型方法上和类上都有有啥区别
Es索引数据迁移 对索引起个别名 好处
适配器模式:进行转换,让两个系统能够完成对接
注册模式和单例模式类似 :提前通过map存储好需要调用的对象。
8、搜索不够灵活 技术Elastic Search https://www.elastic.co/cn/
包含了数据的整合 =》提取 =》存储 =》使用,一整套。
9、es中索引 ==》mysql里的表
10、Es不止存储,还能分词,非常高效和灵活
索引:书籍的目录,快速的找到内容正向索引
mysql索引为正序如字典,Es的索引为倒排索引
11、Es几种调用方式:RestFul调用 发送http请求、kibana devtools
Es:9200:给外部访问的端口 9300给Es集群内部通信的
12、Es中mapping代表数据库的表结构 也可以手动指定mapping
13、Es分词器:分词的一种规则
a.空格分词器
b.标准分词规则
14、数据同步:把数据从mysql同步到es。
a.首次安装完es,全量同步到es 。增量同步:定时任务 优点:不同引入第三方中间件。缺点:有时间差。
b.双写:写数据时候必须写ES。更新删除数据库同理。(要用事务)单项的 MySql=》ES 可以通过定时任务+日志+告警进行检测和修复
c.Es的工具:用Logstash数据同步管道,一般配合kafka+消息队列+beats采集器使用 性能较差
15、Logstash传输和处理数据的管道
16、预编译sql优点:快、防注入、性能好。
17、jmeter做压力测试的
标签:聚合,String,索引,搜索,Es,鱼皮,数据,es From: https://www.cnblogs.com/yulili1101/p/17643417.html