-
Notifications
You must be signed in to change notification settings - Fork 57
项目介绍
“学术分享搜索引擎”是一个带社交元素的学术搜索引擎,除了对底层爬取的学术资源提供搜索功能外,还提供论文推荐、用户管理、可视化发现等功能。结合了Scrapy,MongoDB,Lucene,Solr,Struts2,Bootstrap,Jquery,D3,CAS开源库和工具完成。
文档旨在说明各个模块的代码设计,各个开源工具的配置和使用情况,帮助二次开发或者利用爬虫、nosql存储、搜索服务等任意一块可以单独使用的模块加入到其他的系统或项目中。
我将从以下几个模块尽可能详细说明我的代码结构和设计,并阐述工具的使用和配置情况:
- Scrapy爬虫模块
- MongoDB存储模块
- 索引模块(包括lucene和solr搜索服务)
- 推荐模块(基于文本相似度计算)
- Tika内容提取模块
- 可视化模块
- 单点登录模块
- 网站其余模块
python部分代码在crawl内,是一个Scrapy项目。_spider.py是我写的爬取蜘蛛程序,.pyc是编译后的文件,.json是一些临时存放文件,可以不管,主要是_spider.py这部分代码。在Scrapy爬虫模块中,我对爬虫项目做了比较具体说明。
网站的代码在AcademicSearchEngine内,整个是一个java web工程,使用maven做管理,依赖了蛮多jar包。除了pom.xml里关联的可以从网上获取的jar外,还额外加入了IKAnalyzer,Tika-app的包。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>AcademicSearchEngine</groupId>
<artifactId>AcademicSearchEngine</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>IKAnalyzer</groupId>
<artifactId>IKAnalyzer</artifactId>
<version>2012u6</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/IKAnalyzer2012_u6.jar</systemPath>
</dependency>
<!-- <dependency> <groupId>tika</groupId> <artifactId>tika</artifactId>
<version>1.3</version> <scope>system</scope> <systemPath>${project.basedir}/lib/tika-app-1.3.jar</systemPath>
</dependency> -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>3.6.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.20</version>
</dependency>
</dependencies>
</project>
我将Tika的依赖注释掉了,是因为Tika-app这个jar和solrj的jar在log4j的使用版本上发生了冲突,而Tika和solrj其实是线上线下分开使用的,所以如果是运行网站的话注释掉Tika是不会影响程序的。关于使用Tika进行内容提取,我会单独写一个page说明的。
说明一下各个package里的类和大致模块。
里面是各个struts2的action类,每个action都只处理某一个请求。大部分是ajax的请求,然后回写到jsp上。具体的对应在struts.xml里。
这个package里的两个.java对程序影响不大,cas的部分主要在web.xml的配置里且cas-client-core的jar包也在webcontent的lib文件夹下。关于cas的部分会单独写一页page说明,这里这个package可以忽略。
DAO介于数据库和后台模块之间,主要面向用户收藏、用户分享、发现页保存计算值、搜索请求的记录、注册时候添加用户等和mysql相关的操作。具体每个DAO的实现都在DAO.impl package内。。
实现了以上DAO模块。完成各个与mysql数据库内table读取和写入的实现过程。
所有和pdf相关的操作代码都在这个package内。DownloadPublication用以批量下载mongodb内带.pdf链接的论文,存储在本地文件系统,支持多线程。PdfAnalyzer作用在于使用Tika,结构化分析pdf内的文本内容,要使用该代码要在pom.xml里把solrj注释掉并把Tika的注释去掉,然后做pdf内容提取和分析的工作。PdfBricker里两个函数分别是把pdf文件存储到mongodb的gridfs里,以及把pdf内容文本存进mongodb里。这两部分代码可以利用,用于论文文件和文本两方面的存储,可以增强和改写。
三个index.java分别对应学者元数据、论文元数据和论文全文数据建索引的代码。都是从mongodb的collection去读取数据,用lucene建立到本地文件系统内。建立索引的代码很基础也很简单。
各个模块里用的一些model类,每个代表一个“结构”。
两个.java,分别是mongodb gridfs的客户端类和mongodb客户端类,稍微封装了下,方便别的模块使用mongodb客户端操作。
mysql的数据库连接池,提高并发下的读写性能,反正是个必备的工具。
推荐模块和相似度计算相关的代码都在这个package内。三个Btw java类用以计算学者、论文、主页之间的内容相似度,里面封装了一些不同的计算需求。CosineDis类是余弦距离计算的主类,是个static类供大家直接调用。PageRank用以重排序计算,也像CosineDis一样在必要的地方调用计算。ResearchWordTag用以计算每个学者的tag并存到数据库里,是个单独使用的类,也可以忽略。
封装过的solrj客户端类,以及所有和solr服务相关的搜索请求函数都在SolrjAjaxService和SolrjHelper内。前者一般相应的是ajax的异步请求。两个类其实性质都差不多,就是封装了各个模块对搜索的不同请求,属于很重要的两个类。
StringUtil比较重要,用的比较多。TikaUtil只有在使用Tika模块的时候需要。其他的util没有多大用处,在开发过程中渐渐弃用了。