Discuz x1.5带有Sphinx的接口,可是相关文档却几乎没有,功能基本上不能使用。
下面就让我来说说如何安装Sphinx并将它集成到Discuz X1.5中。
注意: 前提是您必须有一个独立的主机或者vps!
以下操作均在ubuntu server 9.04中进行的,其它系统操作相差不大。
下载安装文件
安装mmseg
下面就让我来说说如何安装Sphinx并将它集成到Discuz X1.5中。
注意: 前提是您必须有一个独立的主机或者vps!
以下操作均在ubuntu server 9.04中进行的,其它系统操作相差不大。
下载安装文件
这里下载的是coreseek,它由国人基于Sphinx二次开发,更适合中文搜索。复制代码
- wget http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.13.tar.gz
- tar zxvf coreseek-3.2.13.tar.gz
- cd coreseek-3.2.13
里面包含修改后的sphinx(csft)及中文分词程序mmseg
安装mmseg
安装coreseek开发的mmseg,它为sphinx提供中文分词功能安装完成后,mmseg使用的词典和配置文件,将自动安装到/usr/local/mmseg/etc中复制代码
- cd mmseg-3.2.13
- ./bootstrap
- #ubuntu环境下,需要使用ACLOCAL_FLAGS="-I /usr/share/aclocal" ./bootstrap
- ./configure --prefix=/usr/local/mmseg
- make
- make install
其中uni.lib就是分词默认使用的词典
如果觉得这个词库词量过小,可到搜狗上下载词库: http://pinyin.sogou.com/dict/list.php
很多词库找不到TXT版的下载,可以直接通过地址: http://pinyin.sogou.com/dict/download_txt.php?id=词库id ,来下载
然后通过下面这种方式生成词典,替换掉默认词典就可以了安装sphinx复制代码
- /usr/local/mmseg/bin/mmseg -u words.txt # utf-8编码
- # 生成的文件名默认为原文件名加.uni后缀
- cp words.txt.uni /usr/local/mmseg/etc/uni.lib
配置sphinx注意:请修改/usr/local/mysql/为相应的mysql目录复制代码
- cd csft-3.2.13
- #执行configure,进行编译配置:
- ./configure --prefix=/usr/local/sphinx \
- --with-mysql=/usr/local/mysql/ \
- --with-mysql-includes=/usr/local/mysql/include/mysql/ \
- --with-mysql-libs=/usr/local/mysql/lib/mysql/ \
- --with-mmseg=/usr/local/mmseg/ \
- --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ \
- --with-mmseg-libs=/usr/local/mmseg/lib/
- make
- make install
1、编写适合discuz x1.5的配置文件文件内容请从这里下载:http://blog.2332.cn/files/sphinx/csft.conf复制代码
- vim /usr/local/sphinx/etc/csft.cnf
把其中的数据库信息修改自己mysql服务器信息,同时不要忘了修改相应的表名前缀。
2、建立sph_counter,在数据库中执行以下语词运行sphinx复制代码
- CREATE TABLE IF NOT EXISTS `sph_counter` (
`counter_id` int(10) NOT NULL, `max_doc_id` int(10) NOT NULL, PRIMARY KEY (`counter_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
1、生成索引文件
索引文件是检索的根据,如果数据量大的话,第一次运行速度会比较慢
执行以下命令:2、运行sphinx程序复制代码
- /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf --all
3、加入crontab计划任务复制代码
- /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/csft.conf
这样的目的是每分钟自动更新索引,以保证检索引擎可以获得最新的数据加上以下内容:复制代码
- vim /etc/crontab
复制代码
- # Incremental Index posts data
- * 0-3 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf posts_minute --rotate
- * 6-23 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf posts_minute --rotate
- 0 4 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf posts_merge --rotate && /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf --merge posts posts_merge --rotate
- # Incremental Index threads data
- * 0-3 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf threads_minute --rotate
- * 6-23 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf threads_minute --rotate
- 0 4 * * * root /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf threads_merge --rotate && /usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/csft.conf --merge threads threads_merge --rotate#
配置Discuz X1.5
1、后台配置补充:操作中可能遇到的问题
Discuz X1.5带有一个简单的接口,简单到你直接是没法使用的。
进入后台->全局->搜索设置,如图设置:
![]()
2、文件修改
打开/source/module/search/forum.php至此,OK,大功告成!复制代码
- //找到以下这行
- if($srchtype == 'fulltext' && $_G['setting']['sphinxon']) {
- //改成
- if($_G['setting']['sphinxon']) {
- //再找到下面几行(注意:仅在你discuz版本为gbk时才需要做以下修改)
- if($srchtype == "fulltext") {
$result = $s->query("'".$srchtxt."'", $_G['setting']['sphinxmsgindex']); - } else {
$result = $s->query($srchtxt, $_G['setting']['sphinxsubindex']); - }
- //改成
- $_srchtxt = iconv('gbk','utf-8',$srchtxt); //将gbk转成utf-8
- if($srchtype == "fulltext") {
$result = $s->query("'".$_srchtxt."'", $_G['setting']['sphinxmsgindex']); - } else {
$result = $s->query($_srchtxt, $_G['setting']['sphinxsubindex']); - }
哈哈,就这样,你也能拥有一个强大的搜索引擎~
相信这将会是你论坛一大亮点!
1、执行indexer可能报错,报错内容为:error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file
解决办法:2、生成词典的时候报错,报错内容为:FATAL: index ‘posts’: unknown charset type ‘zh_cn.gbk’复制代码
- echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf
- ldconfig
那是因为你的配置文件改成这样了:charset_type = zh_cn.gbk
解决办法:
官方说,还是使用utf-8靠谱,改回来charset_type = zh_cn.utf-8
只要在往数据库取数据时,执行 set names utf-8,即使你的数据表的编码是gbk,也可以正常读出的。
但注意,搜索的时候,还是要将编码转成utf-8后才能正确搜索。