现在的位置: 首页 > 搜索技术 > 正文

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

2014年11月07日 搜索技术 ⁄ 共 4696字 ⁄ 字号 评论关闭

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

 

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

2.目标
利用信息检索工具,搜索http://beijing.cncn.com/网站中的景点介绍网页,对其进行索引,使用户可通过关键字查询,快速定位感兴趣的景点。

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

1)        软件环境:Ubuntu 10.04JDK-1.6

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

3)        Web服务器:tomcat
Apache-tomcat-6.0.26
安装包

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

5)        汉语分词工具: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

$ cd nutch-1.2    
$ ant            
编译,生成可执行程序和库
$ ant war            
编译war文件,供tomcat使用

2)        设置要搜索的URL
$ mkdir urls
$ echo "http://beijing.cncn.com/jingdian/" > urls/addr.txt

$ vi conf/nutch-default.xml
    
编辑如下(否则运行时会报agent相关错误)
      
<name>http.agent.name</name>
       <value>test</value>

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

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

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

6)        用命令行检索(用命令行方式检索相关“北海”的信息)
$ 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)        设置tomcatnutch接口(复制war文件到tomcat目录)
$ cp /exports/download/src/nutch-1.2/build/nutch-1.2.war $CATALINA_BASE/webapps/nutch-1.2.war

4)        支持中文显示
$ vi /exports/download/src/apache-tomcat-6.0.26/conf/server.xml 编辑如下
      
<Connector port="8080" protocol="HTTP/1.1"

              connectionTimeout="20000"
              redirectPort="8443"
              URIEncoding="UTF-8" useBodyEncodingForURI="true"/>

5)        指定搜索结果存储的目录
注意webapps/nutch-1.2目录为通过war包生成的目录,替换war包时需要删除此目录
$ vi $CATALINA_BASE/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml
编辑如下
 
<configuration>
    <property>
        <name>searcher.dir</name>
     <value>/exports/download/src/nutch-1.2/crawl/</value>
    </property>
  </configuration>

6)        开启web服务
$ catalina.sh run

7)        通过网页访问搜索结果
打开firefox,在地址栏输入
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: (<CJK>)+ >
以下为生成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 { 
……

3)        下载修改好的IKAnalysis.jar包,以下网载是修改好的jar包,从官网下载的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/

4)        修改分词调用函数
$ 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);
}

5)        修改编译脚本build.xml
编译时加入IKjar包,在<lib></lib>之间(约200行)加入:
<include name="IKAnalyzer3.2.8.jar"/>
设置自动编译war包,之后无需再ant war
修改<targe tname="job" depends="compile">,改为<target name="job" depends="compile,war">

6)        编译
$ ant

7)        设置tomcatnutch接口(复制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

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

9)        重启tomcat,在网页中搜索即可

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

9.参考

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

抱歉!评论已关闭.