建立垂直搜索引擎&中文分词

关键字:垂直搜索引擎中文分词 nutch tomcat linux

1.说明
建立简单的垂直搜索引擎。 通过实际操作信息搜索软件,环境配置,了解主要模块的构成,及交互方式。通过修改搜索软件,了解软件架构,接口及插件等运作方式。 通过对分词部分的修改,了解了分词原理及主流的中文分词技术及其应用。

2.目标
利用信息检索工具,搜索 http://beijing.cncn.com/

网站中的景点介绍网页,对其进行索引,使用户可通过关键字查询,快速定位感兴趣的景点。

3.软件介绍
由于搜索引擎是多个软件协作完成的,软件之间版本相互依赖,以下选择了 nutch1.2 及相关版本软件。

  1. 软件环境:Ubuntu 10.04,JDK-1.6

  2. 信息检索工具:Nutch 1.2 源码
    当前 nutch 版本 1.4,此版本不直接支持 tomcat,需要通过 solr,因而选择 nutch 1.2,该版本可以通过

svn 标签下载

  1. Web 服务器:tomcat
    Apache-tomcat-6.0.26 安装包

  2. 辅助工具(用于查看搜索结果):luke
    lukeall-1.0.1.jar 包,1.0 以上版本才能与 nutch1.2 配合

  3. 汉语分词工具:IKAnalysis
    针对 nutch 1.2 版本修改过的 IKAnalyzer3.2.8_wave.jar(直接下载标准版 jar 包,在使用 web

页面搜索时有问题)

4.配置环境
实现环境为 linux ubuntu 10.04,需要编译 java 源码,所以安装相关工具

  1. 安装 ant
    ** $ apt-get install ant1.8 **

  2. 安装 svn(用于下载 nutch1.2 源码) ** $ apt-get install subversion **

  3. 安装配置 java 环境
    ** $ apt-get install openjdk-6-jdk
    $ export JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk **

  4. 安装 javacc(用于中文分词时生成 java 代码) ** $ apt-get install javacc **

5.Nutch 安装及配置

  1. 下载安装
    ** $ svn co [http://svn.apache.org/repos/asf/nutch/tags/release-1.2

./nutch-1.2

](http://svn.apache.org/repos/asf/nutch/tags/release-1.2%20./nutch-1.2)
$ cd nutch-1.2
$ ant ** 编译,生成可执行程序和库 **
$ ant war ** 编译 war 文件,供 tomcat 使用

  1. 设置要搜索的 URL
    ** $ mkdir urls
    $ echo "http://beijing.cncn.com/jingdian/" > urls/addr.txt
    $ vi conf/nutch-default.xml ** 编辑如下(否则运行时会报 agent 相关错误) ** http.agent.name
    test **

  2. 设置搜索地址过滤
    ** $ vi conf/crawl-urlfilter.txt ** 编辑如下
    ** #+^http://([a-z0-9]\.)MY.DOMAIN.NAME/
    +^http://([a-z0-9]\.)beijing.cncn.com/jingdian/ **

  3. 开始对网页生成索引(爬虫) ** $ bin/nutch crawl urls -dir crawl -depth 5 -topN 5 -threads 1 **
    此时建立 crawl 目录,其中含索引信息,可通过命令或 luke 程序查看索引结果

  4. 查看生成的索引(可以看到抓取的网页个数) ** $ bin/nutch readdb crawl/crawldb–stats **

  5. 用命令行检索(用命令行方式检索相关“北海”的信息) ** $ bin/nutch org.apache.nutch.searcher.NutchBean ' 北海 ** ** ' **

6.Tomcat 安装及配置

  1. 下载(此版本含可执行程序,无需编译) apache-tomcat-6.0.26.tar.gz

  2. 设置相关环境变量(可设置在 $HOME/.bashrc 中) ** $ export CATALINA_BASE="/exports/download/src/apache-tomcat-6.0.26/"
    $ export CATALINA_HOME="/exports/download/src/apache-tomcat-6.0.26/"
    $ export PATH=\(PATH:\)CATALINA_HOME/bin **

  3. 设置 tomcat 与 nutch 接口(复制 war 文件到 tomcat 目录) ** $ cp /exports/download/src/nutch-1.2/build/nutch-1.2.war

$CATALINA_BASE/webapps/nutch-1.2.war **

  1. 支持中文显示
    ** $ vi /exports/download/src/apache-tomcat-6.0.26/conf/server.xml 编辑如下
    **

  2. 指定搜索结果存储的目录
    注意 webapps/nutch-1.2 目录为通过 war 包生成的目录,替换 war 包时需要删除此目录
    ** $ vi $CATALINA_BASE/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml **

编辑如下
**

searcher.dir
/exports/download/src/nutch-1.2/crawl/

**

  1. 开启 web 服务
    ** $ catalina.sh run **

  2. 通过网页访问搜索结果
    打开 firefox,在地址栏输入 [http://127.0.0.1:8080/nutch-1.2/

](http://127.0.0.1:8080/nutch-1.2/)

7.中文分词

  1. 修改 jj 源码,生成支持词索引的 java 文件
    ** $ cd $nutch-1.2/
    $ vim src/java/org/apache/nutch/analysis/NutchAnalysis.jj **
    做以下修改,以支持中文词的搜索
    ** | <SIGRAM: ()+ > **
    以下为生成 java 文件,并覆盖原有文件
    ** $ cd $nutch-1.2/src/java/org/apache/nutch/analysis
    $ javacc -OUTPUT_DIRECTORY=./ika/ NutchAnalysis.jj
    $ mv./ika/*./; rmdir ika; **

** 2) ** 修改刚编译出来的 NutchAnalysis.java
** $ vim $nutch-1.2/src/java/org/apache/nutch/analysis/NutchAnalysis.java **
两处加入 ParseException(否则编译时会报错)
** public static Query parseQuery(String queryString, Configuration conf)

throws IOException,ParseException {
……
public static Query parseQuery(String queryString, Analyzer analyzer,

Configuration conf) throws IOException,ParseException {
…… **

  1. 下载修改好的 IKAnalysis.jar 包,以下网载是修改好的 jar 包,从官网下载的 jar 包在见面查询时有问题
    [

http://trac.nchc.org.tw/cloud/attachment/wiki/waue/2011/0801/IKAnalyzer3.2.8_waue.jar

](http://trac.nchc.org.tw/cloud/attachment/wiki/waue/2011/0801/IKAnalyzer3.2.8_waue.jar)
将 jar 包复制到相应目录下
** $ cp IKAnalyzer3.2.8.jar $nutch-1.2/lib/ **

  1. 修改分词调用函数
    ** $ vim src/java/org/apache/nutch/analysis/NutchDocumentAnalyzer.java **
    调用 IK 分词工具,修改 tokenStream 函数如下
    ** public TokenStream tokenStream(String fieldName, Reader reader) {
    Analyzer analyzer;
    if ("anchor".equals(fieldName))
    analyzer = ANCHOR_ANALYZER;
    else
    //analyzer = CONTENT_ANALYZER;
    analyzer = new org.wltea.analyzer.lucene.IKAnalyzer();
    return analyzer.tokenStream(fieldName, reader);
    } **

  2. 修改编译脚本 build.xml
    编译时加入 IK 的 jar 包,在 之间(约 200 行)加入: ** **
    设置自动编译 war 包,之后无需再 ant war
    修改 ** ,改为 <target name="job"

depends="compile,war"> **

  1. 编译
    ** $ ant **

  2. 设置 tomcat 与 nutch 接口(复制 war 文件到 tomcat 目录) ** $ rm /exports/download/src/apache-tomcat-6.0.26/webapps/nutch-1.2–r **
    目录 webapps/nutch-1.2 是自动生成的,替换 war 包时需要将其删掉,新的 war 包才能生效
    ** $ cp /exports/download/src/nutch-1.2/build/nutch-1.2.war

$CATALINA_HOME/webapps/nutch-1.2.war **

  1. 重新生成索引
    ** $ bin/nutch crawl urls -dir crawl -depth 5 -topN 5 -threads 1 **

  2. 重启 tomcat,在网页中搜索即可

8.支持与或非运算
使用 +- 号可进行与非运算,使用时需要注意 +- 号前需加空格,后面直接与词相连,不加空格
在有些情况下,换替了分词工具后,无法进行布尔运算了,这是由于有些分词工具将布尔运算符当成停用词或符号去掉了(详见 NutchAnalysis.java

的分词返回结果),分词后索引的接口是 IndexSearch。

9.参考

  1. 分词介绍
    http://trac.nchc.org.tw/cloud/wiki/waue/2011/0801