建立垂直搜索引擎&中文分词
建立垂直搜索引擎&中文分词
关键字:垂直搜索引擎中文分词 nutch tomcat linux
1.说明
建立简单的垂直搜索引擎。
通过实际操作信息搜索软件,环境配置,了解主要模块的构成,及交互方式。通过修改搜索软件,了解软件架构,接口及插件等运作方式。
通过对分词部分的修改,了解了分词原理及主流的中文分词技术及其应用。
2.目标
利用信息检索工具,搜索 http://beijing.cncn.com/
网站中的景点介绍网页,对其进行索引,使用户可通过关键字查询,快速定位感兴趣的景点。
3.软件介绍
由于搜索引擎是多个软件协作完成的,软件之间版本相互依赖,以下选择了
nutch1.2 及相关版本软件。
软件环境:Ubuntu 10.04,JDK-1.6
信息检索工具:Nutch 1.2 源码
当前 nutch 版本 1.4,此版本不直接支持 tomcat,需要通过 solr,因而选择 nutch 1.2,该版本可以通过
svn 标签下载
Web 服务器:tomcat
Apache-tomcat-6.0.26 安装包辅助工具(用于查看搜索结果):luke
lukeall-1.0.1.jar 包,1.0 以上版本才能与 nutch1.2 配合汉语分词工具:IKAnalysis
针对 nutch 1.2 版本修改过的 IKAnalyzer3.2.8_wave.jar(直接下载标准版 jar 包,在使用 web
页面搜索时有问题)
4.配置环境
实现环境为 linux ubuntu 10.04,需要编译 java 源码,所以安装相关工具
安装 ant
** $ apt-get install ant1.8 **安装 svn(用于下载 nutch1.2 源码) ** $ apt-get install subversion **
安装配置 java 环境
** $ apt-get install openjdk-6-jdk
$ export JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk **安装 javacc(用于中文分词时生成 java 代码) ** $ apt-get install javacc **
5.Nutch 安装及配置
- 下载安装
** $ 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 使用
设置要搜索的 URL
** $ mkdir urls
$ echo "http://beijing.cncn.com/jingdian/" > urls/addr.txt
$ vi conf/nutch-default.xml ** 编辑如下(否则运行时会报 agent 相关错误) **http.agent.name
test **设置搜索地址过滤
** $ vi conf/crawl-urlfilter.txt ** 编辑如下
** #+^http://([a-z0-9]\.)MY.DOMAIN.NAME/
+^http://([a-z0-9]\.)beijing.cncn.com/jingdian/ **开始对网页生成索引(爬虫) ** $ bin/nutch crawl urls -dir crawl -depth 5 -topN 5 -threads 1 **
此时建立 crawl 目录,其中含索引信息,可通过命令或 luke 程序查看索引结果查看生成的索引(可以看到抓取的网页个数) ** $ bin/nutch readdb crawl/crawldb–stats **
用命令行检索(用命令行方式检索相关“北海”的信息) ** $ bin/nutch org.apache.nutch.searcher.NutchBean ' 北海 ** ** ' **
6.Tomcat 安装及配置
下载(此版本含可执行程序,无需编译) apache-tomcat-6.0.26.tar.gz
设置相关环境变量(可设置在 $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 **设置 tomcat 与 nutch 接口(复制 war 文件到 tomcat 目录) ** $ cp /exports/download/src/nutch-1.2/build/nutch-1.2.war
$CATALINA_BASE/webapps/nutch-1.2.war **
支持中文显示
** $ vi /exports/download/src/apache-tomcat-6.0.26/conf/server.xml 编辑如下
** 指定搜索结果存储的目录
注意 webapps/nutch-1.2 目录为通过 war 包生成的目录,替换 war 包时需要删除此目录
** $ vi $CATALINA_BASE/webapps/nutch-1.2/WEB-INF/classes/nutch-site.xml **
编辑如下
**
**
开启 web 服务
** $ catalina.sh run **通过网页访问搜索结果
打开 firefox,在地址栏输入 [http://127.0.0.1:8080/nutch-1.2/
](http://127.0.0.1:8080/nutch-1.2/)
7.中文分词
- 修改 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 {
…… **
- 下载修改好的 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/ **
修改分词调用函数
** $ 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);
} **修改编译脚本 build.xml
编译时加入 IK 的 jar 包,在之间(约 200 行)加入: ** **
设置自动编译 war 包,之后无需再 ant war
修改 **,改为 <target name="job"
depends="compile,war"> **
编译
** $ ant **设置 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 **
重新生成索引
** $ bin/nutch crawl urls -dir crawl -depth 5 -topN 5 -threads 1 **重启 tomcat,在网页中搜索即可
8.支持与或非运算
使用 +- 号可进行与非运算,使用时需要注意 +-
号前需加空格,后面直接与词相连,不加空格
在有些情况下,换替了分词工具后,无法进行布尔运算了,这是由于有些分词工具将布尔运算符当成停用词或符号去掉了(详见
NutchAnalysis.java
的分词返回结果),分词后索引的接口是 IndexSearch。
9.参考
- 分词介绍
http://trac.nchc.org.tw/cloud/wiki/waue/2011/0801