个人环境:Windows XP+JDK1.6+Eclipse3.7+Nutch1.2+Cygwin+Tomcat7.0+ant1.8.3+Javacc5.0+Luke
环境说明:
<1> Nutch1.2而非1.4,主要因为1.4的学习资料少且生成的crawl目录下没有index目录,不利于Luke中文分词的查看
<2> Nutch是开源的搜索引擎,Java语言编写,故其运行环境需要JDK的支持
<3> Nutch运行在Linux上,Windows下需要Cygwin模拟Linux环境
<4> Java开发采用Eclipse开发工具
<5> 运行Tomcat Web服务器搭建可视化的搜索平台
<6> ant重建工程
<7> Javacc编译Java源码
<8> Luke查看中文分词
一、准备
JDK1.6下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
Eclipse3.7下载地址:http://www.eclipse.org/
Nutch1.2下载地址:http://apache.etoak.com//nutch/apache-nutch-1.2-bin.zip
Cygwin下载地址:http://www.cygwin.com/
Tomcat7.0下载地址:http://tomcat.apache.org/
ant1.8.3下载地址:http://ant.apache.org/bindownload.cgi
Javacc5.0下载地址:http://javacc.java.net/
Luke:下载地址http://www.getopt.org/luke/
二、步骤
(1)JDK安装简单,最后配置好环境变量Path,在命令行下用 java -version 能够查看版本信息说明安装成功;Tomcat下载绿色版,无需安装,配置好环境变量Path。
二者详细配置参考:http://blog.csdn.net/cailibiao/article/details/7608952
(2)Eclipse下载绿色版,无需安装,解压即可使用
(3)Nutch1.2下载解压,后面创建工程的时候会用到,注意解压后不能放到eclipse的workspace目录下
(4)ant和Javacc只需配置好环境变量Patch即可
(5)Luke只要下载完后双击jar文件即可运行
(6)Cygwin安装相对复杂一点,具体步骤如下:
官网http://www.cygwin.com/下载setup.exe并安装
些处的包选择默认安装即可,不要选全部安装
最后配置环境变量Path(否则eclipse中运行nutch工程会出错)
三、Nutch1.2导入Eclipse中
1. 新建工程
(1)新建工程,在Location处选择解压的nutch-1.2目录
(2)在Source选项下,添加输出目录tmp_build,主要是防止原有目录下的nutch被覆写
(3)切换到Libraries选项下,Add Class Folder,选择conf
(4)切换到Order and Export选项下,选中conf,然后Top到顶端,主要是为了后面配置起来更方便点
(5)切换回Libraries选项下,选Add External Jars,添加lib目录下所有的jar文件
(6) 添加完点Finish会弹出如下窗口,这主要是我们改了输出目录为tmp_build,点NO
2. 修改代码
(1)conf/nutch-site.xml
(2)conf/nutch-default.xml
(3)conf/crawl-urlfilter.txt
(4)在项目根目录下新建weburls.txt文件,输入如下内容
(5)设置参数:Run as->Run Configuration
主类:
运行参数:
(6)运行,完成后在根目录下自动创建crawl目录
四、中文分词
1. 准备
将IKAnalyzer3.2.8.jar文件拷入nutch/lib目录下,并在eclipse的nutch项目中添加这个jar包。
2. 修改代码
(1)NutchAnalysis.jj
在nutch/src/java/org/apache/nutch/analysis目录
在该文件里找到 | <SIGRAM: <CJK> >,这代表按字划分,修改为 | <SIGRAM: (<CJK>)+ >
将NutchAnalysis.jj文件拷到其他目录下,如nutch/src/java/org/apache/nutch/clustering目录
用javacc工具编译NutchAnalysis.jj的源代码,将生成的所有java源代码(7个文件)全部覆盖到原 src/java/org/apache/nutch/analysis包下.
javacc的使用方法:cmd进入到NutchAnalysis.jj所在目录
输入命令:
javacc NutchAnalysis.jj
就会生成7个文件了。
(2)NutchAnalysis.java
在nutch/src/java/org/apache/nutch/analysis目录
在两个位置加入ParseException异常捕捉命令,否则ant时会提示出错。下面的代码已经添加
public static Query parseQuery(String queryString, Configuration conf) throws IOException,ParseException{
return parseQuery(queryString, null, conf);
}
public static Query parseQuery(String queryString, Analyzer analyzer, Configuration conf)
throws IOException,ParseException {
NutchAnalysis parser = new NutchAnalysis(
queryString, (analyzer != null) ? analyzer : new NutchDocumentAnalyzer(conf));
parser.queryString = queryString;
parser.queryFilters = new QueryFilters(conf);
return parser.parse(conf);
}
(3)Query.java
修改完上面代码后你会发现org.apache.nutch.searcher包中的Query.java报错。
解决方法是找到报错的地方用try{}catch(){}语句抓住异常,不要抛出,否则接下来还要改很多文件。
public static Query parse(String queryString, String queryLang, Configuration conf)
throws IOException {
Query query = null;
try
{
try
{
query = NutchAnalysis.parseQuery(queryString, AnalyzerFactory.get(conf).get(queryLang), conf);
}
catch (ParseException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
catch(IOException e)
{
e.printStackTrace();
}
return fixup(query, conf);
}
(4)NutchDocumentAnalyzer.java
<1> 引入IKAnalyzer包
import org.wltea.analyzer.lucene.IKAnalyzer;
<2> 修改public TokenStream tokenStream(String fieldName, Reader reader) {函数为:
public TokenStream tokenStream(String fieldName, Reader reader) {
/* Analyzer analyzer;
if ("anchor".equals(fieldName))
analyzer = ANCHOR_ANALYZER;
else
analyzer = CONTENT_ANALYZER;
return analyzer.tokenStream(fieldName, reader);
*/
Analyzer analyzer = new org.wltea.analyzer.lucene.IKAnalyzer();
return analyzer.tokenStream(fieldName, reader);
}
(5)nutch/build.xml
<1> 在<target name="war" depends="jar,compile,generate-docs"></target>的<lib></lib>之间<include name="log4j-*.jar"/> 下(约200行),加入下面的命令使得编译war
文件的时候加入je-analysis的jar文件,注意IKAnalyzer3.2.8.jar的版本号
<include name="IKAnalyzer3.2.8.jar"/>
<2>修改<target name="job" depends="compile">,改为<target name="job" depends="compile,war">这样编译后能自动在bulid文件夹下生成nutch-1.2.job,nutch-1.2.war,nutch-1.2.jar文件了。(注:不这样也可以,最后直接ant war, ant jar 就能生成nutch-1.2.war,nutch-1.2.jar)
(6)ant
cmd进入命令行,切换到nutch所在目录,执行ant命令,就会开始ant工作(相当于重新编译一下)。完成后会在nutch目录下生成build目录
(7)文件替换
<1> 将build/nutch-1.2.job替换nutch目录下文件
<2> 将build/nutch-1.2.jar替换nutch目录下文件
<3> 将build/nutch-1.2.war替换nutch目录下文件,这步不需要的
注:如果ant后没有在build目录下生成nutch-1.2.jar和nutch-1.2.war文件,则命令行执行命令 ant jar 和 ant war生成这两个文件
(8)重新爬行
重新运行eclipse,生成crawl目录。
五、Luke查看分词结果
(1)File->Open Lucene index,选择上面生成的crawl目录下的index目录
(2)未分词前
(3)分词后
六、Nutch部署到Tomcat中
(1)将新生成的nutch-1.2.war拷贝到Tomcat 7.0/webapps目录下,启动Tomcat服务后(运行bin目录下的startup.bat文件,每次运行之后关闭用shutdown.bat),会自动在该目录下生成一个nutch-1.2文件夹。
(2)将新生成的nutch-1.2.jar文件和分词包(IKAnalyzer3.2.8.jar)拷贝到tomcat的WEB-INF/lib下面
(3)在tomcat/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml 文件中如下配置,F:\Graduate\nutch\nutch-1.2\crawl为搜索结果目录
<configuration>
<property>
<name>searcher.dir</name>
<value>F:\Graduate\nutch\nutch-1.2\crawl</value>
</property>
</configuration>
(4)如果出现乱码,则将tomcat安装目录下conf/server.xml定位到connector并修改一下:
<Connector prot="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
(5)http://localhost:8080/nutch 搜索测试
(6)分词后出现的问题
在重新部署后,你在搜索时会发现有时会出先空白页,有的句子、词输入进去无法查询。
针对与这个情况,查看tomcat log发现如下提示:
org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet jsp threw exception
java.lang.StringIndexOutOfBoundsException: String index out of range: -3
解决方法:
在tomcat中部署的nutch目录下进入WEB-INF\classes
找到nutch-site.xml 在这里添加如下代码即可。
<property>
<name>plugin.includes</name>
<value>protocol-http|urlfilter-regex|parse-(text|html|js)|analysis-(zh)|index-basic|query-(basic|site|url)|summary-lucene|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
</property>