2021年4月

一、选题

工程类搜索型:

定向采集 3-4 个新闻网站, 实现这些网站信息的抽取、索引和检索。网页数 目不少于 10 万条。能按相关度、时间、热度 (需要自己定义) 等属性进行排序, 能实现相似 新闻的自动聚类。
要求: 有相关搜索推荐、snippet 生成、结果预览 (鼠标移到相关结果, 能预览) 功能

二、开发工具

  • jdk 版本:1.7

  • 服务器:Tomcat7.0

  • python:2.7

  • scrapy:1.0

三、设计方案

3.1整体思路

在实现新闻信息检索系统时首先进行了信息采集,信息采集结束之后使用 Lucene 提供的 api 构建索引库, 前端使用 jsp 接收用户查询,在后台使用 servlet 对用户查询进 行分词处理,之后到索引库中进行文档匹配, 最后把查询结果集反馈给用户并在前端页面中 展示。

3.2信息采集

Scrapy 是 Python 开发的一个快速、高层次的屏幕抓取和 web 抓取框架,用于抓取 web 站点并从页面中提取结构化的数据。我们采集了 10w+ 新闻数据, 新闻信息以 json 文件格 式保存。scrapy 采集流程:
这里写图片描述
采集到的新闻数据:
这里写图片描述
新闻格式:
这里写图片描述

3.3倒排索引构建

在索引构建模块,主要包括下面三个关键步骤: 数据预处理、新闻内容分词、构建倒排 索引。
**数据预处理:**Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象, 或者反过来。我们使用 Gson 把 json 文件转换为 News 对象
**中文分词:**IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具 包,IK 发展为面向 Java 的公用分词组件,独立于 Lucene 项目,同时提供了对 Lucene 的默 认优化实现。IK 分词采用了特有的“正向迭代最细粒度切分算法“, 支持细粒度和智能分词两 种切分模式, 并且采用了多子处理器分析模式, 支持英文字母、数字、中文词汇等分词处理, 兼容韩文、日文字符。
**构建倒排索引:**Lucene 提供了构建倒排索引的方法,步骤如下图所示:
这里写图片描述
Luke 是一个用于 Lucene 搜索引擎的,方便开发和诊断的第三方工具,它可以访问
现有 Lucene 的索引. 使用 luke 打开索引目录,可以看到新闻信息被存储到索引库中。
这里写图片描述

3.4索引查询

索引创建好以后,查询可分为以下几个步骤:
1. 设置查询索引的目录 (这里就是上面创建索引的目录).
2. 创建 indexSearcher.
3. 设置 query 的分词方式
4. 设置查询域, 比如查询域为 news title, 那么就到新闻标题域去比对 5. 设置查询字符串,也就是要查询的关键词.
6. 返回结果是一个文档集合,放在 TopDocs 中,通过循环 TopDocs 数组输出查询结果. 用户一般只看前几页的数据,为了加快前端的数据展示, 返回前 1000 条数据到前台。

3.5关键字高亮

检索结果高亮对于用户的体验度和友好度非常重要,可以快速标记出用户检索对关键 词。Lucene 的 Highlighter 类可以用于返回文档中的关键字高亮,通过在关键字前面添加 css 片段来实现。

3.6用户界面

使用 jsp 编写用户界面,服务器为 Tomcat 7.0, 用户输入关键词以后提交表单,后
台使用 servlet 接收用户查询, 之后把查询字符串作为搜索的 key 到索引库中搜索文档。检索效果:
这里写图片描述

3.7按时间排序和结果分页

按时间排序: 所有的新闻结果存放在一个 list 集合中,集合中的每个元素为一个 News 对象, 通过重写 Comparator 类中的 compare 方法实现按集合中每个新闻元素的 Time 排 序。
结果分页: 定义了一个 Page 类用来记录当前页、总页数、每页多少条数据、总的数据 数、每页起始数、每页终止数、是否有下一页、是否有前一页。

四、参考资料

下面列出可参考的资料:
1. lucene全文检索基础
2. lucene创建索引
3. Lucene查询索引
4. Lucene查询结果高亮
5. Lucene 查询(Query)子类
6. java操作json
7. java集合
8. servlet基础

五、总结

开源工具的使用显著提高了开 发效率,但build from ground还需要学习很多东西,继续沉淀。
欢迎批评指正。


简单记录一下搜索引擎的基本原理和搭建步骤。


搜索引擎基本框架




搭建搜索引擎主要分为三个步骤:Web信息的搜集;信息的索引与检索;Web服务提供接口。



1.信息搜集

信息搜集的原理是将互联网看成一个大的图,则信息搜集可以看成是图的遍历,目的是为了获取高质量的网页,其搜集的策略就有广度优先搜索和深度优先搜索及网站采集和全局URL采集等。推荐的开源信息搜集工具是Weblech,Weblech的基本流程图为:






2.索引与搜索

在建立索引上,大规模数据的索引常常使用倒排索引,具体的介绍百度百科介绍的挺好:倒排索引,建立倒排索引的流程如下(在分词的同时还需要有英文的词根还原,去除停用词等处理):



检索是用户提交一个查询(Query),搜索引擎查找与该查询相关结果的过程。检索的模型包括布尔模型,向量空间模型等。在检索过程中有一些判断网页等级/重要性的方法比如Google的PageRank,IBM的HITS算法等。


推荐的开源索引及检索工具为全文检索工具包Lucence。关于Lucence的具体介绍见上一篇文章Lucence全文搜索框架。



3.Web接口

用户查询请求的处理程序利用脚本语言ASP,PHP,JSP等编写即可。


接口的主要功能为:1)获取用户查询式:把用户通过Form输入的查询语句封装发送给检索服务器。2)显示结果:从检索服务器获取结果,缓存幵分页呈现给用户。


推荐的开源Web服务器工具为Tomcat。



————————————————

版权声明:本文为CSDN博主「qiuyang0607」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qiuyoungster/article/details/7657369


有时候我们想导出某次版本提交时有哪些变更的文件,在 svn 中有一个 export 功能,很方便,如下图所示。

在 Git 中我也找到了以下两种方法。

方法1

使用 git 自带命令 git archive, 语法如下。

git archive -o c:/Users/yourusername/Desktop/export.zip NewCommitId $(git diff --name-only OldCommitId NewCommitId)

使用示例如下:

git archive -o c:/Users/yourusername/Desktop/export.zip 479d554cf570edcc28c20ce264c6f216f8223bf3 $(git diff --name-only a838d0512e84e5eb42569cce3ef305d3ac1c44d0 479d554cf570edcc28c20ce264c6f216f8223bf3)

这样会在桌面生成一个 export.zip 压缩包。

这个方法需要敲命令,且每次拷贝前后提交的版本号,会稍显麻烦。

方法2

下载 TortoiseGit Git 客户端软件,使用方法和 svn 的 export 功能类似。

很明显,方法2不用敲命令,不用拷贝提交版本号,方法2更方便,更实用!

但遗憾的是,我没有在 Source Tree 软件中找到类似的功能,需要装两个客户端,有点蛋疼。

如果你知道 Source Tree 中类似的导出变更文件功能,可以在下方留言。

版权申明:本文系 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。


发布于 2020-11-30


对于某些服务来说如果直接暴露于公网上将会存在安全隐患。

使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,只有自己才可访问,但是访问者也需要运行另外一个 frpc。

以下示例将会创建一个只有自己能访问到的 ssh 穿透服务代理。


frps.ini服务端配置

Bash

[common]bind_port = 7000
bind_udp_port = 7001
dashboard_port = 7500
log_file = /root/frp/frps.log
log_level = info
log_max_days = 3
authentication_timeout = 0
token = frp888
max_pool_count = 50


启动 frpc,转发内网的 ssh 服务,配置如下,不需要指定远程端口:

待对方访问

frpc.ini客户端配置

Bash

[common]server_addr = 服务端IP
server_port = 7000
token = frp888[client_A]type = stcp#SK跟访问者一致才能连通,可以自己随便设sk = abcdefg
local_ip = 127.0.0.1
local_port = 3389


在要访问这个服务的机器上启动另外一个 frpc,配置如下:

要访问对方

frpc.ini客户端配置

Bash

[common]server_addr = 服务端IP
server_port = 7000
token = frp888[client_A_visitor]type = stcp
role = visitor#server_name同上面[client_A]一致,待访问端和访问者client_A字段可以替换成自己想要的server_name = client_A
sk = abcdefg
bind_ip = 127.0.0.1
bind_port = 2222


说明:

bind_addr = 127.0.0.1绑定监听本地IP

bind_port = 2222绑定监听本地端口,可自定义。

本地SSH工具通过 127.0.0.1:2222,既可访问到已穿透的3389服务。

server_name = 要访问的穿透服务名称。

sk = 只有 sk 一致的用户才能访问到此服务,可自定义。

role = stcp 的访问者,可自定义。


注意:这是最精简使用的方法实例,如你有更多要求,请参考详细参数阅读。


国外vps穿透后远程桌面速度慢(想放视频),带宽不够.国内服务器贵的一匹
尝试以下方案
P2P点对点穿透(stcp)
连接速度取决访问端和客户端的带宽,与服务器无干

访问端--(服务器)--客户端(受访问的机器)

客户端配置

[common] 
server_addr = 47.98.250.160
server_port = 7000
token = P2QTwF6Lhn9W8kA0

[rdp]
type = stcp
 sk = abcdefg
 local_ip = 127.0.0.1
 local_port = 3389

访问端配置

[common]
server_addr = 47.98.250.160
server_port = 7000
token = P2QTwF6Lhn9W8kA0

[rdp]
type = stcp
role = visitor
server_name = p2p_rdp
sk = abcdefg 
bind_addr = 127.0.0.1
bind_port = 63389

服务器(vps)配置

服务器端不需要特别配置,只需要指定一个udp端口
即bind_udp_port = 7001
比如7001吧

在两台win10电脑上测试了,连接成功,但我这速度依然不理想,校园网背锅?
win10访问端只要打开windows附件里远程桌面填写地址127.0.0.1:63389即可
这个端口自己指定

刷了高恪,不带frp 路由未测试