Ubuntu环境下:Nutch1.2 二次开发(中文分词)

前提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 = 0;//中文片段的起始位置定义

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

再在后面加上:

 1 {
 2     if (stream == null) {
 3                 stream  = new IKTokenizer(new StringReader(image.toString()),true);
 4                 //stream = Analyzer.tokenStream("",new StringReader(image.toString()));
 5                 cjkStartOffset = matchedToken.beginColumn;
 6                 try {
 7                     stream.reset();
 8                 } catch (IOException e) {
 9                     e.printStackTrace();
10                 }
11                 termAtt = (TermAttribute) stream.addAttribute(TermAttribute.class);
12                 offAtt = (OffsetAttribute) stream.addAttribute(OffsetAttribute.class);
13                 try {
14                     if (stream.incrementToken() == false)
15                         termAtt = null;
16                 } catch (IOException e) {
17                     // TODO Auto-generated catch block
18                     e.printStackTrace();
19                 }
20             }
21             if (termAtt != null && !termAtt.term().equals("")) {
22                 matchedToken.image = termAtt.term();
23                 matchedToken.beginColumn = cjkStartOffset + offAtt.startOffset();
24                 matchedToken.endColumn = cjkStartOffset + offAtt.endOffset();
25                 try {
26                     if (stream.incrementToken() != false)
27                         input_stream.backup(1);
28                     else
29                         termAtt = null;
30                 } catch (IOException e) {
31                     e.printStackTrace();
32                 }
33             }
34             if (termAtt == null || termAtt.term().equals("")) {
35                 stream = null;
36                 cjkStartOffset = 0;
37             }
38 }

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>
时间: 2024-10-11 04:22:10

Ubuntu环境下:Nutch1.2 二次开发(中文分词)的相关文章

JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误

问题一:出现控制台坏的响应错误一Bad request 控制台出现错误如下: Bad Request request: http://hostIP:8983/solr/update?wt=javabin&version=1 解决方法: 出现以上错误的原因是,solr服务器上配置的Field和javabean提交的Field不能对应, 导致solr服务器找不到域,拒绝访问. 打开SOLR_HOME下的conf文件夹找到schema.xml文件,在其中添加对应的域. 例如以下代码添加了:title,

【转载】Ubuntu环境下配置Android Studio

之前学习Android开发的时候,一直跟各种教程一样,使用的是Eclipse+ADT,主要是比较方便,容易上手,特别是对于习惯用Eclipse开发java的朋友来说,上手更是好无压力.但毕竟Eclipse+ADT最多只能算Google的干儿子,特别是在有了亲儿子Android Studio后,今后的潮流必定是使用Android Studio进行android开发. 因为嫌麻烦,所以一直没尝试,昨天闲来无事,鼓捣了一下,把Android Studio配置好了,最大的直观感受就是:漂亮!对平时总是羡

Ubuntu环境下配置Android Studio【转】

本文转载自:https://www.jianshu.com/p/1f6295f9c955 之前学习Android开发的时候,一直跟各种教程一样,使用的是Eclipse+ADT,主要是比较方便,容易上手,特别是对于习惯用Eclipse开发java的朋友来说,上手更是好无压力.但毕竟Eclipse+ADT最多只能算Google的干儿子,特别是在有了亲儿子Android Studio后,今后的潮流必定是使用Android Studio进行android开发. 因为嫌麻烦,所以一直没尝试,昨天闲来无事,

Ubuntu环境下SSH的安装及使用

Ubuntu环境下SSH的安装及使用 SSH是指Secure Shell,是一种安全的传输协议,Ubuntu客户端可以通过SSH访问远程服务器 .SSH的简介和工作机制可参看上篇文章SSH简介及工作机制. SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudoapt-get install openssh-client),如果要使本机开放SSH服务就需要安装ope

Linux和Ubuntu环境下B2G(Firefox OS)安装、编译、测试教程集合

1在ubuntu上测试Firefox OS(B2G)系统 Firefox OS,项目代号为"Boot 2 Gecko",是一个开放的完全基于WEB标准的智能手机操作系统,由Mozilla公司开发.Firefox OS 底层属于Linux,开放的Web技术,而不是特定于平台的原生API,用HTML5 编写应用程序.Firefox OS 每日构建版目前可在电脑桌面上试用. 安装过程非常简单,下面是详细的步骤说明: 点 这里 下载 ... 2在 ubuntu系统上建立b2g系统(翻译) 你已

ubuntu环境下eclipse的安装以及hadoop插件的配置

ubuntu环境下eclipse的安装以及hadoop插件的配置 一.eclipse的安装 在ubuntu桌面模式下,点击任务栏中的ubuntu软件中心,在搜索栏搜索eclipse 注意:安装过程需要输入用户密码. 二.eclipse的配置 待eclipse安装好以后,在命令行输入whereis eclipse 找到eclipse的安装路径 在文件目录下找到eclipse中的插件目录 然后在打开一个文件目录窗口找到hadoop/contrib/eclipse-plugin中的eclipse插件—

在Ubuntu环境下配置Proxmark3(PM3)使用环境

参考资料:PM3官方Wiki 因为国内网络上大多是在Kali系统上使用PM3的教程(链接1.链接2.链接3),而这些教程的步骤对于Ubuntu系统并不完全适用.所以写下本文,记录我个人的安装经历. 本教程与官方Wiki相比省略了部分步骤,仅验证过在全程root用户操作时可行,建议按照官方英文教程进行安装 官方Wiki中的刷写固件步骤(Flashing XXX)非必须且风险较大,除非有需求,否则不要轻易刷固件,容易变砖 一.安装必要软件包 在终端中依次执行以下命令 sudo apt update

Ubuntu环境下的Redis 配置与C++使用入门

  Redis是一个高性能的key-value数据库. Redisedis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用.它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便. 本文将通过介绍Ubuntu环境下的Redis 配置,介绍C++入门使用的方式,帮助读者快速上手Redis. 安装配置 获取源码.解压.进入源码目录,编译

Ubuntu环境下Webbench的应用

Ubuntu环境下Webbench的应用 1.概述 Webbench是知名的网站压力测试工具.Webbench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况.webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数和每秒钟传输数据量.webbench不但能具有便准静态页面的测试能力,还能对动态页面(ASP,PHP,JAVA,CGI)进 行测试的能力.还有就是他支持对含有SSL的安全网站例如电子商务网站进行静态或动态的性能测试. Webbench最多可以模

Ubuntu环境下安装SVN客户端

1.在Ubuntu环境下安装svn需要一下依赖包 subversion-1.8.10.tar.gz:http://download.csdn.net/detail/luo849278597/8208909 sqlite-amalgamation-3071501.zip:http://download.csdn.net/detail/luo849278597/8208923 m4-1.4.17.tar.gz:http://download.csdn.net/detail/luo849278597/