关键字:垂直搜索引擎中文分词 nutch tomcat linux
1.说明
建立简单的垂直搜索引擎。
通过实际操作信息搜索软件,环境配置,了解主要模块的构成,及交互方式。通过修改搜索软件,了解软件架构,接口及插件等运作方式。
通过对分词部分的修改,了解了分词原理及主流的中文分词技术及其应用。
2.目标
利用信息检索工具,搜索http://beijing.cncn.com/网站中的景点介绍网页,对其进行索引,使用户可通过关键字查询,快速定位感兴趣的景点。
3.软件介绍
由于搜索引擎是多个软件协作完成的,软件之间版本相互依赖,以下选择了nutch1.2及相关版本软件。
1) 软件环境:Ubuntu 10.04,JDK-1.6
2) 信息检索工具:Nutch 1.2源码
当前nutch版本1.4,此版本不直接支持tomcat,需要通过solr,因而选择nutch 1.2,该版本可以通过svn标签下载
3) Web服务器:tomcat
Apache-tomcat-6.0.26安装包
4) 辅助工具(用于查看搜索结果):luke
lukeall-1.0.1.jar包,1.0以上版本才能与nutch1.2配合
5) 汉语分词工具:IKAnalysis
针对nutch 1.2版本修改过的IKAnalyzer3.2.8_wave.jar(直接下载标准版jar包,在使用web页面搜索时有问题)
4.配置环境
实现环境为linux ubuntu 10.04,需要编译java源码,所以安装相关工具
1) 安装ant
$ apt-get install ant1.8
2) 安装svn(用于下载nutch1.2源码)
$ apt-get install subversion
3) 安装配置java环境
$ apt-get install openjdk-6-jdk
$ export JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk
4) 安装javacc(用于中文分词时生成java代码)
$ apt-get install javacc
5.Nutch安装及配置
1) 下载安装
$ svn co http://svn.apache.org/repos/asf/nutch/tags/release-1.2 ./nutch-1.2
$ cd nutch-1.2
$ ant 编译,生成可执行程序和库
$ ant war 编译war文件,供tomcat使用
2) 设置要搜索的URL
$ mkdir urls
$ echo "http://beijing.cncn.com/jingdian/" > urls/addr.txt
$ vi conf/nutch-default.xml 编辑如下(否则运行时会报agent相关错误)
<name>http.agent.name</name>
<value>test</value>
3) 设置搜索地址过滤
$ vi conf/crawl-urlfilter.txt 编辑如下
#+^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/
+^http://([a-z0-9]*\.)*beijing.cncn.com/jingdian/
4) 开始对网页生成索引(爬虫)
$ bin/nutch crawl urls -dir crawl -depth 5 -topN 5 -threads 1
此时建立crawl目录,其中含索引信息,可通过命令或luke程序查看索引结果
5) 查看生成的索引(可以看到抓取的网页个数)
$ bin/nutch readdb crawl/crawldb –stats
6) 用命令行检索(用命令行方式检索相关“北海”的信息)
$ bin/nutch org.apache.nutch.searcher.NutchBean '北海'
6.Tomcat安装及配置
1) 下载(此版本含可执行程序,无需编译)
apache-tomcat-6.0.26.tar.gz
2) 设置相关环境变量(可设置在$HOME/.bashrc中)
$ export CATALINA_BASE="/exports/download/src/apache-tomcat-6.0.26/"
$ export CATALINA_HOME="/exports/download/src/apache-tomcat-6.0.26/"
$ export PATH=$PATH:$CATALINA_HOME/bin
3) 设置tomcat与nutch接口(复制war文件到tomcat目录)
$ cp /exports/download/src/nutch-1.2/build/nutch-1.2.war $CATALINA_BASE/webapps/nutch-1.2.war
4) 支持中文显示
$ vi /exports/download/src/apache-tomcat-6.0.26/conf/server.xml 编辑如下
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
5) 指定搜索结果存储的目录
注意webapps/nutch-1.2目录为通过war包生成的目录,替换war包时需要删除此目录
$ vi $CATALINA_BASE/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml 编辑如下
<configuration>
<property>
<name>searcher.dir</name>
<value>/exports/download/src/nutch-1.2/crawl/</value>
</property>
</configuration>
6) 开启web服务
$ catalina.sh run
7) 通过网页访问搜索结果
打开firefox,在地址栏输入 http://127.0.0.1:8080/nutch-1.2/
7.中文分词
1) 修改jj源码,生成支持词索引的java文件
$ cd $nutch-1.2/
$ vim src/java/org/apache/nutch/analysis/NutchAnalysis.jj
做以下修改,以支持中文词的搜索
| <SIGRAM: (<CJK>)+ >
以下为生成java文件,并覆盖原有文件
$ cd $nutch-1.2/src/java/org/apache/nutch/analysis
$ javacc -OUTPUT_DIRECTORY=./ika/ NutchAnalysis.jj
$ mv ./ika/* ./ ; rmdir ika;
2) 修改刚编译出来的NutchAnalysis.java
$ vim $nutch-1.2/src/java/org/apache/nutch/analysis/NutchAnalysis.java
两处加入ParseException(否则编译时会报错)
public static Query parseQuery(String queryString, Configuration conf) throws IOException,ParseException {
……
public static Query parseQuery(String queryString, Analyzer analyzer, Configuration conf) throws IOException,ParseException {
……
3) 下载修改好的IKAnalysis.jar包,以下网载是修改好的jar包,从官网下载的jar包在见面查询时有问题
http://trac.nchc.org.tw/cloud/attachment/wiki/waue/2011/0801/IKAnalyzer3.2.8_waue.jar
将jar包复制到相应目录下
$ cp IKAnalyzer3.2.8.jar $nutch-1.2/lib/
4) 修改分词调用函数
$ vim src/java/org/apache/nutch/analysis/NutchDocumentAnalyzer.java
调用IK分词工具,修改tokenStream函数如下
public TokenStream tokenStream(String fieldName, Reader reader) {
Analyzer analyzer;
if ("anchor".equals(fieldName))
analyzer = ANCHOR_ANALYZER;
else
//analyzer = CONTENT_ANALYZER;
analyzer = new org.wltea.analyzer.lucene.IKAnalyzer();
return analyzer.tokenStream(fieldName, reader);
}
5) 修改编译脚本build.xml
编译时加入IK的jar包,在<lib></lib>之间(约200行)加入:
<include name="IKAnalyzer3.2.8.jar"/>
设置自动编译war包,之后无需再ant war
修改<targe tname="job" depends="compile">,改为<target name="job" depends="compile,war">
6) 编译
$ ant
7) 设置tomcat与nutch接口(复制war文件到tomcat目录)
$ rm /exports/download/src/apache-tomcat-6.0.26/webapps/nutch-1.2 –r
目录webapps/nutch-1.2是自动生成的,替换war包时需要将其删掉,新的war包才能生效
$ cp /exports/download/src/nutch-1.2/build/nutch-1.2.war $CATALINA_HOME/webapps/nutch-1.2.war
8) 重新生成索引
$ bin/nutch crawl urls -dir crawl -depth 5 -topN 5 -threads 1
9) 重启tomcat,在网页中搜索即可
8.支持与或非运算
使用+-号可进行与非运算,使用时需要注意+-号前需加空格,后面直接与词相连,不加空格
在有些情况下,换替了分词工具后,无法进行布尔运算了,这是由于有些分词工具将布尔运算符当成停用词或符号去掉了(详见NutchAnalysis.java的分词返回结果),分词后索引的接口是IndexSearch。
9.参考
1) 分词介绍
http://trac.nchc.org.tw/cloud/wiki/waue/2011/0801