zoukankan      html  css  js  c++  java
  • 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 }
    View Code

    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-INFclasses

    找到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>
    
  • 相关阅读:
    寒假特训——搜索——H
    寒假特训——I
    寒假训练——搜索 K
    three.js 加载STL文件
    three.js 加载3DS 404 文件找不到
    C# 请求数据 方式1
    学习 一个简单的业务处理
    ABP 05 创建Model 以及 相应的增删改查
    ABP 04 用户的创建
    ABP 00 常用知识
  • 原文地址:https://www.cnblogs.com/xxx0624/p/4242663.html
Copyright © 2011-2022 走看看