中华人民共和国XXXX总署网站使用jsp编写,估计整站架构在J2EE上。对于那个庞大的系统而言,我个人只是个游击队员,做好我的事情,让他们iframe去吧。
我打算使用Mysql(高于5的版本)+PHP完成。虽说Mysql内部已经支持FullText检索,但对于大量汉字而言,还是很不理想,如果数据量巨大,等待时间会很长。所以在网上搜寻解决方案。看到了Xunsearch的开源项目,看了他们的API,头有点大了,于是再找,所有线索都指向SCWS这个东东。最后突然发现:SCWS就是Xunsearch的爷爷。所以硬着头皮还是自己认真再搞吧。这是项目历史:
- 在 Xungle 项目的运作过程中,我们发现还有大量的用户出于各种原因,不得不自行解决搜索技术。此外, 我们发现了国外一个优秀的开源搜索引擎基础库 Xapian,它采用 C/C++ 开发,并且性能卓越,久经考验。 但是并没有整合中文分词,并且开发难度、复杂度也较大。于是我们下决心整合 Xapian 和 Scws,并在此基础上 提供更多、更常用的搜索功能。这就是 Xunsearch ,目前版本发布正在准备中,代码也已托管到 github 中。
接着看看项目的许可协议,很好,很给力GPL。
- Xunsearch (包含 SDK 在内) 是一个免费开源的全文搜索软件,在以下描述的 GPL 通用许可证的条款下发布。
首先,我使用的是Win7(32Bit),Xunsearch需要Linux运行环境,正好是我的强项。下载Virtualbox(Opensource的,鄙视日常使用盗版VM)。
网址是:virtualbox.org
然后去下载CentOS,登陆mirrors.sohu.com,选择合适的版本,我用的可是精简版哦。
ok,一边下着ISO一边安装并新建一个3G的虚拟机,我不是财迷只分3G空间,我用的是固态硬盘,一共才30个G。再说也没必要弄那么大,我估计2个G就够。建好后如下图:
接下来就是安装CentOS6。呵呵,
固态硬盘真是给力,笔记本2分钟搞定系统安装,真的只有2分钟啊。系统重启,然后就是LAMP罗:
- yum install mysql-server php php-mysql ntsysv
在YUM的时候错了,闹出了一些小插曲,首先是虚拟机没IP,不知怎么回事,编辑几个文件,设定好。然后设置mirrors.sohu.com的yum源,把mirrors打成了mirror,让我好半天才找到这个错误。
接着yum install wget,下载xunsearch-full-latest.tar.bz2稳定包,放到/opt下解压。
郁闷的事来了,告诉我先是没有g++,我就装。又是没有make,我又装。后来告诉我没有c++的编译器。。。晕了,gcc不就能编译c++了么。。。怎么回事,又上网搜。最后找到一个gcc-c++软件包。安装,再次回来执行
- sh setup.sh
又出问题了,提示我zlib.h没找到。需要安装zlib1g-dev或者zlib-devel包。麻烦的,zlib1g-dev库里没有,安装的是zlib-devel。接着继续编译。千万别在error了,拜托。过了很久、很久,终于装好了。%>_
看来用最小化的CentOS包下载简单,稍复杂点使用的时候就麻烦了。
使用/opt/bin/xs-ctl.sh start/restart/stop可以开始、重启和关闭。
按照安装建议,编辑/etc/rc.local文件加入
/opt/bin/xs-ctl.sh start。
后来发现问题,httpd启动了但从WIN7下访问不到。两天后我又重做了系统,按xunsearch的默认目录安装,还是访问不到。弄了半天,才发现Iptalbes给拒绝了。所以关闭iptables。就ok罗。
现在可以做测试了。vi index.php
结果是这样的:
看来符合要求。
后来才发现,在Linux下直接把这个PHP文件当作命令即可:
接着做测试:
其实,已经能够看到返回结果了。效果还不错。这个Demo展示了xunsearch的主要功能。最后看一下这个Demo的ini配置文件:
其中8383是索引服务端口,8384是搜索服务端口。这两个端口一定都得正常运行才能提供有效服务。
接下来,测试字段和布尔搜索功能:
这是再测试一下日志相关的搜索情况,其中 --suggest 是搜索建议,当用户敲入少许汉字或字母时给出相应的关键词建议(常用于搜索输入框下拉自动提示),而 --related 表示相关搜索、--hot 表示热门搜索、 --correct 表示搜索纠错。
现在还暂时不涉及到编程,估计下一步就开始做开发了。但毕竟弄懂原理是第一位的。
- [root@sm ~]# cd /usr/local/xunsearch/
- [root@sm xunsearch]# ls
- bin data etc include lib sdk share tmp
- [root@sm xunsearch]# ./sdk/php/util/
- Indexer.php Quest.php SearchSkel.php XSDataSource.class.php
- IniWizzard.php RequiredCheck.php skel/ XSUtil.class.php
- [root@sm xunsearch]# ./sdk/php/util/RequiredCheck.php
- Xunsearch PHP-SDK 运行需求检查
- ==============================
-
- 检查内容
- --------
-
- 本程序用于确认您的服务器配置是否能满足运行 Xunsearch PHP-SDK 的要求。
- 它将检查服务器所运行的 PHP 版本,查看是否安装了合适的PHP扩展模块,以及
- 确认 php.ini 文件是否正确设置。
-
- +------------+------------+--------------------------+--------------------------------+
- | 项目 | 结果 | 用于 | 备注 |
- +------------+------------+--------------------------+--------------------------------+
- | PHP 版本 | 5.3.8 | XS(core) | PHP 5.2.0 或更高版本是必须的。 |
- | SPL 扩展 | OK | XS(core) | SPL 扩展用于自动加载和对象戏法 |
- | PCRE 扩展 | OK | XSDocument, XSSearch | 用于字符串切割、判断 |
- | 编码转换 | mbstring | XSDocument, XSSearch | 用于支持非 UTF-8 字符集 |
- | 缓存模块 | WARNING | XS | 用于缓存项目配置文件的解析结果 |
- | JSON 扩展 | OK | util.Quest, util.Indexer | 用于读取或输出 JSON 格式的数据 |
- | XML 扩展 | OK | util.Indexer | 用于读取导入 XML 格式的数据 |
- | MySQL 扩展 | mysql | util.Indexer | 用于读取导入 MySQL 的数据库 |
- | SQLite 扩 | sqlite | util.Indexer | 用于读取导入 SQLite 的数据库 |
- +------------+------------+--------------------------+--------------------------------+
-
- 检查结果
- --------
-
- 共计 8 项通过,1 项警告,0 项错误。
-
- 您的服务器配置符合 Xunsearch/PHP-SDK 的最低要求。
- 如果您需要使用特定的功能,请关注上述的 WARNING 项。
- [root@sm xunsearch]# ls
- bin data etc include lib sdk share tmp
- [root@sm xunsearch]# ./bin/xs-ctl.sh restart
- INFO: stopping server[xs-indexd] (BIND:127.0.0.1:8383) .... [OK]
- INFO: re-starting server[xs-indexd] ... (BIND:127.0.0.1:8383)
- INFO: stopping server[xs-searchd] (BIND:127.0.0.1:8384) .... [OK]
- INFO: re-starting server[xs-searchd] ... (BIND:127.0.0.1:8384)
- ./bin/xs-ctl.sh: line 71: 5576 段错误 bin/xs-searchd -l tmp/searchd.log -b $bsearch -k $cmd
- [root@sm xunsearch]# ls
- bin data etc include lib sdk share tmp
- [root@sm xunsearch]# ll
- 总计 32
- drwxr-xr-x 2 root root 4096 12-01 21:46 bin
- drwxr-xr-x 2 root root 4096 12-01 21:46 data
- drwxr-xr-x 2 root root 4096 12-01 21:45 etc
- drwxr-xr-x 4 root root 4096 12-01 21:45 include
- drwxr-xr-x 3 root root 4096 12-01 21:45 lib
- drwxr-xr-x 3 root root 4096 12-01 21:46 sdk
- drwxr-xr-x 5 root root 4096 12-01 21:44 share
- drwxr-xr-x 2 root root 4096 12-01 22:13 tmp
- [root@sm xunsearch]# ls data/
- [root@sm xunsearch]# ls tmp/
- indexd.log pid.127_0_0_1_8383 pid.127_0_0_1_8384 searchd.log
- [root@sm xunsearch]# cat tmp/searchd.log
- 2011-12-01 22:13:48 searchd[26192] caught system exceptional signal[11], terminate immediately
- 2011-12-01 22:13:48 searchd[26194] bind() or listen() failed, error: Address already in use(#98)
- 2011-12-01 22:13:48 searchd[26194] socket server listen/bind failed
- 2011-12-01 22:17:06 searchd[5103] caught system exceptional signal[11], terminate immediately
- 2011-12-01 22:17:06 searchd[5105] succesful to spawn child worker[1] process (PID:5106)
- 2011-12-01 22:17:06 searchd[5105] succesful to spawn child worker[2] process (PID:5107)
- 2011-12-01 22:17:06 searchd[5105] succesful to spawn child worker[3] process (PID:5108)
- 2011-12-01 22:17:06 ~master[5105] search server is ready for waiting system signal (WORKER_NUM:3)
- 2011-12-01 22:17:06 worker1[5106] I came, happy to meet you
- 2011-12-01 22:17:06 worker1[5106] init the thread pool
- 2011-12-01 22:17:06 worker2[5107] I came, happy to meet you
- 2011-12-01 22:17:06 worker2[5107] init the thread pool
- 2011-12-01 22:17:06 worker3[5108] I came, happy to meet you
- 2011-12-01 22:17:06 worker3[5108] init the thread pool
- 2011-12-01 22:17:06 worker1[5106] event server start (FLAG:0x0004)
- 2011-12-01 22:17:06 worker2[5107] event server start (FLAG:0x0004)
- 2011-12-01 22:17:06 worker3[5108] event server start (FLAG:0x0004)
- 2011-12-01 22:21:07 ~master[5105] caught SIGINT, shutdown gracefully
- 2011-12-01 22:21:07 ~master[5105] broadcast exit signal[2] to all worker processes
- 2011-12-01 22:21:07 worker1[5106] caught SIGINT, shutdown gracefully
- 2011-12-01 22:21:07 worker1[5106] NULL connection pointer received, server quit gracefully
- 2011-12-01 22:21:07 worker1[5106] event server end
- 2011-12-01 22:21:07 worker1[5106] deinit the thread pool
- 2011-12-01 22:21:07 worker2[5107] caught SIGINT, shutdown gracefully
- 2011-12-01 22:21:07 worker2[5107] NULL connection pointer received, server quit gracefully
- 2011-12-01 22:21:07 worker2[5107] event server end
- 2011-12-01 22:21:07 worker2[5107] deinit the thread pool
- 2011-12-01 22:21:07 worker3[5108] caught SIGINT, shutdown gracefully
- 2011-12-01 22:21:07 worker3[5108] NULL connection pointer received, server quit gracefully
- 2011-12-01 22:21:07 worker3[5108] event server end
- 2011-12-01 22:21:07 worker3[5108] deinit the thread pool
- 2011-12-01 22:21:07 ~master[5105] child process worker[2] exit (PID:5107, STATUS:0)
- 2011-12-01 22:21:07 ~master[5105] child process worker[1] exit (PID:5106, STATUS:0)
- 2011-12-01 22:21:07 ~master[5105] child process worker[3] exit (PID:5108, STATUS:0)
- 2011-12-01 22:21:07 ~master[5105] byebye, I should exit now
- 2011-12-01 22:21:08 searchd[5576] caught system exceptional signal[11], terminate immediately
- 2011-12-01 22:21:08 searchd[5578] succesful to spawn child worker[1] process (PID:5579)
- 2011-12-01 22:21:08 searchd[5578] succesful to spawn child worker[2] process (PID:5580)
- 2011-12-01 22:21:08 searchd[5578] succesful to spawn child worker[3] process (PID:5581)
- 2011-12-01 22:21:08 ~master[5578] search server is ready for waiting system signal (WORKER_NUM:3)
- 2011-12-01 22:21:08 worker1[5579] I came, happy to meet you
- 2011-12-01 22:21:08 worker1[5579] init the thread pool
- 2011-12-01 22:21:08 worker1[5579] event server start (FLAG:0x0004)
- 2011-12-01 22:21:08 worker2[5580] I came, happy to meet you
- 2011-12-01 22:21:08 worker2[5580] init the thread pool
- 2011-12-01 22:21:08 worker3[5581] I came, happy to meet you
- 2011-12-01 22:21:08 worker3[5581] init the thread pool
- 2011-12-01 22:21:08 worker2[5580] event server start (FLAG:0x0004)
- 2011-12-01 22:21:08 worker3[5581] event server start (FLAG:0x0004)
- [root@sm xunsearch]# ./bin/xs-ctl.sh restart
- INFO: stopping server[xs-indexd] (BIND:127.0.0.1:8383) .... [OK]
- INFO: re-starting server[xs-indexd] ... (BIND:127.0.0.1:8383)
- INFO: stopping server[xs-searchd] (BIND:127.0.0.1:8384) .... [OK]
- INFO: re-starting server[xs-searchd] ... (BIND:127.0.0.1:8384)
- [root@sm xunsearch]# ls
- bin data etc include lib sdk share tmp
- [root@sm xunsearch]# ./sdk/php/util/Indexer.php --source=csv --clean demo
- 清空现有索引数据 ...
- 初始化数据源 ... csv
- WARNING: input file not specified, read data from STDIN>
- 开始批量导入数据 (请直接输入数据) ...
- 1,关于 xunsearch 的 DEMO 项目测试,项目测试是一个很有意思的行为!,1314336158
- 2,测试第二篇,这里是第二篇文章的内容,1314336160
- 3,项目测试第三篇,俗话说,无三不成礼,所以就有了第三篇,1314336168
- INFO: reach end of file or error occured, total lines: 3
- 完成索引导入:成功 3 条,失败 0 条
- 刷新索引提交 ...
- [root@sm xunsearch]#
- [root@sm xunsearch]# ./sdk/php/util/Quest.php demo 项目
- 在 3 条数据中,大约有 2 条包含 项目 ,第 1-2 条,用时:0.0307 秒。
-
- 1. 项目测试第三篇 #3# [100%]
- 俗话说,无三不成礼,所以就有了第三篇
- Chrono:1.31434e+09
-
- 2. 关于 xunsearch 的 DEMO 项目测试 #1# [98%]
- 项目测试是一个很有意思的行为!
- Chrono:1.31434e+09
-
- [root@sm xunsearch]# ./sdk/php/util/Quest.php demo 测试
- 在 3 条数据中,大约有 3 条包含 测试 ,第 1-3 条,用时:0.0071 秒。
-
- 1. 测试第二篇 #2# [100%]
- 这里是第二篇文章的内容
- Chrono:1.31434e+09
-
- 2. 项目测试第三篇 #3# [97%]
- 俗话说,无三不成礼,所以就有了第三篇
- Chrono:1.31434e+09
-
- 3. 关于 xunsearch 的 DEMO 项目测试 #1# [96%]
- 项目测试是一个很有意思的行为!
- Chrono:1.31434e+09
-
- [root@sm xunsearch]#
- [root@sm xunsearch]# cat ./sdk/php/app/demo.ini
- project.name = demo
- project.default_charset = utf-8
- server.index = 8383
- server.search = 8384
-
- [pid]
- type = id
-
- [subject]
- type = title
-
- [message]
- type = body
-
- [chrono]
- type = numeric
-
- [root@sm xunsearch]#
接下来,测试字段和布尔搜索功能:
- [root@sm xunsearch]# ./sdk/php/util/Indexer.php --flush-log demo
- 刷新搜索日志 ...
- 成功,注意:后台更新需要一些时间,并不是真正立即完成。
- [root@sm xunsearch]# ./sdk/php/util/Quest.php demo subject:测试
- 在 3 条数据中,大约有 3 条包含 subject:测试 ,第 1-3 条,用时:0.0095 秒。
-
- 1. 测试第二篇 #2# [100%]
- 这里是第二篇文章的内容
- Chrono:1.31434e+09
-
- 2. 项目测试第三篇 #3# [97%]
- 俗话说,无三不成礼,所以就有了第三篇
- Chrono:1.31434e+09
-
- 3. 关于 xunsearch 的 DEMO 项目测试 #1# [93%]
- 项目测试是一个很有意思的行为!
- Chrono:1.31434e+09
-
- [root@sm xunsearch]# ./sdk/php/util/Quest.php demo pid:2
- 在 3 条数据中,大约有 1 条包含 pid:2 ,第 1-1 条,用时:0.0060 秒。
-
- 1. 测试第二篇 #2# [100%]
- 这里是第二篇文章的内容
- Chrono:1.31434e+09
-
- [root@sm xunsearch]# ./sdk/php/util/Quest.php demo "第三篇 OR pid:1"
- 在 3 条数据中,大约有 2 条包含 第三篇 OR pid:1 ,第 1-2 条,用时:0.0066 秒。
-
- 1. 项目测试第三篇 #3# [100%]
- 俗话说,无三不成礼,所以就有了第三篇
- Chrono:1.31434e+09
-
- 2. 关于 xunsearch 的 DEMO 项目测试 #1# [0%]
- 项目测试是一个很有意思的行为!
- Chrono:1.31434e+09
-
- 相关搜索:第三
-
- [root@sm xunsearch]# ./sdk/php/util/Quest.php demo "第三篇 or pid:1"
- 在 3 条数据中,大约有 0 条包含 第三篇 or pid:1 ,第 0-0 条,用时:0.0056 秒。
-
- 相关搜索:第三
-
- [root@sm xunsearch]#
现在还暂时不涉及到编程,估计下一步就开始做开发了。但毕竟弄懂原理是第一位的。