首页 > 搜索引擎开发学习 > 基于Nutch的站内搜索引擎搭建(二)

基于Nutch的站内搜索引擎搭建(二)

2012年8月9日 发表评论 阅读评论
文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   转载请注明,谢谢合作。

---

Windows下Nutch的安装配置,参见:基于Nutch的站内搜索引擎搭建(一)

本节在上回基础上,对Nutch添加中文分词插件,进行二次开发,同时辅助Nutch分析工具了解Nutch的工作机制,并对其进行一些简单的优化配置。内容如下:

===部件及安装===

===Nutch添加中文分词插件===

===重新爬取建立索引发布===

===参考资料===

===========================================

部件及安装

Javacc:一个Java语法分析器,可以读取上下文无关且有着特殊意义的语法并把它转换成可以识别且匹配该语法的JAVA程序,这里主要用于将Nutch添加中文分词后进行重新编译生成Nutch的分词程序。附上快盘下载链接:Javacc下载

安装Javacc,解压缩包后,将Javacc的bin路径添加到环境变量Path中,然后可cmd测试命令Javacc验证。

IK Analyzer:开源分词软件,下载地址:http://code.google.com/p/ik-analyzer/

Luke:访问Lucene索引的开发分析工具,可以显示并修改Lucene索引内容,下载地址:http://www.getopt.org/luke/

===========================================

Nutch添加中文分词插件

1)修改.jj文件,重编译

Nutch默认分词功能中没有中文分词,所以需要添加中文分词功能,Nutch的analysis类包主要负责分词,在工程文件夹中找到\src\java\org\apache\nutch\analysis文件,对NutchAnalysis.jj文件进行修改,将


|<SIGRAM: <CJK>>

改为


|<SIGRAM: (<CJK>)+>

然后使用javacc语法分析器重新编译文件NutchAnalysis.jj,如图所示

编译之后生产7个java源文件,将其覆盖analysis包下的原文件,刷新工程出现错误,改之,如下图所示,将错误进行捕获,添加部分代码如下:

2)添加编写中文分词插件

将IKAnalyzer.jar添加到工程目录下的lib文件夹中,刷新项目,然后右键buildpath, Libraries中选择Add Jars,将其添加到Libraries中。下面我们就利用IKAnalyzer来为Nutch编写一个中文分词插件,使其具有中文分词的功能。

这方面,网上大部分资料都是对Nutch源码直接进行修改的,这样的做法个人感觉是比较乱的,我们可以参考Nutch本身自带的分词插件编写规范,例如法语分词功能:\src\plugin\analysis-fr,Nutch的功能都是以插件的机制实现的,就像是法语分词功能一样,我们添加中文分词也最好以插件的形式进行,这样也做到模块分明,方便修改,不然在源码中直接改来改去怪乱的。

右击工程名,NewàSource Folder,将文件名字命名为(参考Nutch本身自带的法语分词插件命名规范):src/plugin/analysis-chinese/src/java,在该文件下继续右键,NewàPackage,命名为(继续参见法语分词插件规范):org.apache.nutch.analysis.chinese,然后在该包下新建分词功能类MyChineseAnalyzer.java,最终布局结果如图所示:我们添加的中文分词插件跟Nutch自带的法语分词插件布局类似:

MyChineseAnalyzer代码编写如下(注:仿Nutch自带法语插件的分词代码编写):

package org.apache.nutch.analysis.chinese;

import java.io.Reader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;

import org.apache.nutch.analysis.NutchAnalyzer;
import org.mira.lucene.analysis.*;

public class MyChineseAnalyzer extends NutchAnalyzer {

	private final static Analyzer ANALYZER = new IK_CAnalyzer();

	public MyChineseAnalyzer(){}

	public TokenStream tokenStream(String fieldName, Reader reader)
	{
		return ANALYZER.tokenStream(fieldName, reader);
	}
}

然后在analysis-chinese文件夹下新建plugin.xml,继续仿Nutch自带法语德语插件规范,如图所示

在plugin.xml添加如下内容,其实完全可以仿照Nutch自带法语插件中的plugin.xml内容进行相应的改写即可。

<?xml version="1.0" encoding="UTF-8"?>

<plugin
   id="analysis-chinese"
   name="Chinese Analysis Plug-in"
   version="1.0.0"
   provider-name="org.apache.nutch">

   <runtime>
      <library name="IKAnalyzer2.0.2OBF.jar">
         <export name="*"/>
      </library>
   </runtime>

   <requires>
      <import plugin="nutch-extensionpoints"/>
      <import plugin="lib-lucene-analyzers"/>
   </requires>

   <extension id="org.apache.nutch.analysis.chinese"
              name="MyChineseAnalyzer"
              point="org.apache.nutch.analysis.NutchAnalyzer">

      <implementation id="ChineseAnalyzer"
                      class="org.apache.nutch.analysis.chinese.MyChineseAnalyzer">
        <parameter name="lang" value="chinese"/>
      </implementation>

   </extension>

</plugin>

从上面的图中可以看出,自带法语德语插件还有一个文件build.xml,同样的道理,我们仿Nutch自带插件来编写,build.xml内容如下:

<?xml version="1.0"?>

<project name="analysis-chinese" default="jar-core">

  <import file="../build-plugin.xml"/>

  <!-- Build compilation dependencies -->
  <target name="deps-jar">
    <ant target="jar" inheritall="false" dir="../lib-lucene-analyzers"/>
  </target>

  <!-- Add compilation dependencies to classpath -->
  <path id="plugin.deps">
    <fileset dir="${nutch.root}/build">
      <include name="**/lib-lucene-analyzers/*.jar" />
    </fileset>
  </path>

</project>

在analysis-chinese文件夹下新建文件夹lib,将IKAnalyzer.jar放入此文件中;然后上级文件夹plugin下的build.xml中做以下处理:


在<target name=”deploy”>中添加<ant dir=”analysis-chinese” target=”deploy”/>

在<target name=”clean”>中添加<ant dir=”analysis-chinese” target=”clean”/>

不要烦,继续…

修改Nutch的运行参数,在文件nutch-default.xml中的plugin.includes属性中添加中文分词插件值,value标签后面加上“|analysis-chinese”;

最后修改Nutch中负责分词的类:NutchDocumentAnalyzer,在路径\src\java\org\apache\nutch\analysis中,相应的语句改为


//CONTENT_ANALYZER = new ContentAnalyzer(conf);

CONTENT_ANALYZER = new IK_CAnalyzer();

此时,中文分词插件已经编写完成了,在Ant运行编译,分别使用job和war编译后,在build文件夹中可以看到中文分词插件编译的结果。

===========================================

重新爬取,并建立索引

现在可以对站点进行重新爬取了,爬取之后发布的细节具体见基于Nutch的站内搜索引擎搭建(一),这里简单使用Luke看一下添加中文分词插件后的区别吧,将luke的二进制可执行文件luke.jar放入到Local文件夹中的index文件中,直接打开就行。

添加插件之前,Nutch的分词结果如下,可以看出,默认是单个字切分的

添加之后呢,Nutch的分词结果如下,呵呵,我的名字都给分出来了,课件IK的分词功力还是不错的。

(全文完)

参考资料:

Nutch1.2 添加IKAnalyzer中文分词

WinXP+cygwin+eclipse配置nutch-1.2,添加IKAnalyzer中文分词

北京邮电大学,李阳:Nutch入门教程

插件的编写思想参见了清华大学新出的一本书,叫《搜索引擎基础教程》,这里说一嘴吐吐槽吧,这本书我寻思买来看看吧,看了之后发现,真心说,很失望,就是一堆的文字概念罗列,真正有用的东西一笔带过不细讲,而无关紧要的概念却是各种展开,成篇大论;不过也不全坏,最后的这个Nutch添加插件的做法个人觉得还可以,真心感觉出书是要负责任的说,国内太多的专业书让人感到失望。