前提nutch1.2已部署到eclipse中

详见:http://www.cnblogs.com/cy163/archive/2013/02/19/2916419.html

1 部署IKAnalyzer3.2.8

1.1 下载IKAnalyzer3.2.8

1.2 将IKAnalyzer3.2.8复制到nutch/lib中,并在eclipse中添加该jar

2 修改analysis源码

2.1 在src/java/org/apache/nutch/analysis包下找到NutchAnalysis.jj

(1)在 PARSER_BEGIN(NutchAnalysis)部分的导入声明中增加:

import org.wltea.analyzer.lucene.IKTokenizer;

(2)在 TOKEN_MGR_DECLS中增加:

IKTokenizer Analyzer;

TermAttribute termAtt = null;//代表用空格分割器分出来的一个中文词

OffsetAttribute offAtt = null;//中文词开始结束标记

TokenStream stream = null;

private int cjkStartOffset = ;//中文片段的起始位置定义

(3)在 TOKEN 部分,找到| <SIGRAM: <CJK> >,这代表按字划分,修改为| <SIGRAM: (<CJK>)+ >

再在后面加上:

 {
if (stream == null) {
stream = new IKTokenizer(new StringReader(image.toString()),true);
//stream = Analyzer.tokenStream("",new StringReader(image.toString()));
cjkStartOffset = matchedToken.beginColumn;
try {
stream.reset();
} catch (IOException e) {
e.printStackTrace();
}
termAtt = (TermAttribute) stream.addAttribute(TermAttribute.class);
offAtt = (OffsetAttribute) stream.addAttribute(OffsetAttribute.class);
try {
if (stream.incrementToken() == false)
termAtt = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (termAtt != null && !termAtt.term().equals("")) {
matchedToken.image = termAtt.term();
matchedToken.beginColumn = cjkStartOffset + offAtt.startOffset();
matchedToken.endColumn = cjkStartOffset + offAtt.endOffset();
try {
if (stream.incrementToken() != false)
input_stream.backup();
else
termAtt = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (termAtt == null || termAtt.term().equals("")) {
stream = null;
cjkStartOffset = ;
}
}

2.2 编译NutchAnalysis.jj

(1)将NutchAnalysis.jj复制到其他文件位置,并用javacc编译(命令:javacc NutchAnalysis.jj)

(2)将生成的7个java源码全部覆盖到src/java/org/apache/nutch/analysis包下。

3 refresh工程,解决各种报错

3.1 NutchAnalysis.java会报错

可以根据eclipse提示,在两个位置加入ParseException异常捕捉命令

3.2 org.apache.nutch.searcher包中的Query.java报错

找到报错的地方用try{}catch(){}语句抓住异常(不要抛出,否则接下来还要改很多文件)。

4 增加or修改源码

(1)修改src/java/org/apache/nutch/analysis包下的NutchDocumentAnalyzer

在private static Analyzer ANCHOR_ANALYZER;后面加上:

private static Analyzer MY_ANALYZER;

在ANCHOR_ANALYZER = new AnchorAnalyzer();后面加上:

MY_ANALYZER = new IKAnalyzer();

把 tokenStream修改为:

public TokenStream tokenStream(String fieldName, Reader reader) {
Analyzer analyzer;
analyzer = MY_ANALYZER;
TokenStream tokenStream = analyzer.tokenStream(fieldName, reader);
tokenStream.addAttribute(TypeAttribute.class);
tokenStream.addAttribute(FlagsAttribute.class);
tokenStream.addAttribute(PayloadAttribute.class);
tokenStream.addAttribute(PositionIncrementAttribute.class);
return tokenStream;
}

(2)修改nutch/build.xml

在 <target name="war" depends="jar,compile,generate-docs"></target>的<lib>< /lib>之间<include name="log4j-*.jar"/> 下,加入下面的命令使的编译war文件的时候加入je-analysis的jar文件,注意IKAnalyzer3.2.8.jar的版本号

<include name="IKAnalyzer3.2.8.jar"/>

修 改<targe tname="job" depends="compile">,改为<target name="job" depends="compile,war">这样编译后能自动在bulid文件夹下生成nutch-1.2.job,nutch- 1.2.war,nutch-1.2.jar文件了

5 编译ant

把源码src复制到其他的nutch1.2中,再用ant编译

编译完成后在build文件夹中会生成三个文件,nutch-1.2.job、nutch-1.2.jar、nutch-1.2.war。

这三个文件用来替换你正式线上的Nutch目录下的文件。如果你只在本机做测试,那就用这三个文件代替根目录下的原来的三个同名文件即可。之后将nutch-1.2.war重新部署。测试成功。

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>

最新文章

  1. $(window).height()获取到的高度不对
  2. python简单文件操作
  3. Object-C中一些不同于C系列语言表现的特性
  4. CSGrandeur的WebGL学习——WebGL教程
  5. 如何在本机上将localhost改为www.dev.com
  6. javascript 知识点坑
  7. psl/sql本地与远程连接配置
  8. Spring MVC(二)
  9. 201312月CCF-2,ISBN号码分析
  10. javaweb之监听器详解
  11. 转:【Java并发编程】之四:守护线程与线程阻塞的四种情况
  12. BS4爬取糗百
  13. 线上系统/tmp 目录不断增长分析与总结
  14. 为何90%的IT技术人员不适合做老大
  15. 【CSS】利用宽高比例的媒体查询
  16. JAVA将汉字转换为全拼以及返回中文的首字母,将字符串转移为ASCII码
  17. /etc/passwd- 和/etc/shadow-文件
  18. jmap -histo pid 输出的[C [B [I [S 的含义
  19. 【codevs1297】硬币 完全背包
  20. Snmp学习总结(二)——WinXP安装和配置SNMP

热门文章

  1. 麦子学院Android开发Java教程ClassCastException 错误解析
  2. MySQL数据库下用户及用户权限配置
  3. 如何查看 Apache 的版本
  4. lnmp下用phpize动态安装PHP模块/扩展(不需要重装PHP)
  5. HDU 1465 第六周L题
  6. MinGW-64 安装
  7. ARP
  8. php正则表达式判断是否为ip格式
  9. centos crontab 定时任务详解
  10. easy ui datagrid 获取选中行的数据