sphinx+MySQL的安装使用(重新整理)

一、MySQL+Sphinx+SphinxSE安装步骤:
1、安装python支持(以下针对CentOS系统,其他Linux系统请使用相应的方法安装)
yum install -y python python-devel

2、编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词词库。)

以下压缩包“sphinx-0.9.8-rc2-chinese.zip”中包含mmseg-0.7.3.tar.gz、sphinx-0.9.8-rc2.tar.gz以及中文分词补丁。

wget http://www.coreseek.com/uploads/sources/csft3_0b2.tar.gz
wget http://www.coreseek.com/uploads/sources/mmseg3_0b2.tar.gz
unzip sphinx-0.9.8-rc2-chinese.zip
tar zxvf mmseg3_0b2.tar.gz
cd mmseg3_0b2/
./configure
make
make install
cd ../

3、编译安装MySQL 5.1.26-rc、Sphinx、SphinxSE存储引擎
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.26-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/
tar zxvf mysql-5.1.26-rc.tar.gz

tar zxvf csft3_0b2.tar.gz
cd csft3_0b2.tar.gz/
patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch
patch -p1 < ../fix-crash-in-excerpts.patch
cp -rf mysqlse ../mysql-5.1.26-rc/storage/sphinx
cd ../

cd mysql-5.1.26-rc/
sh BUILD/autorun.sh
./configure --with-plugins=sphinx --prefix=/usr/local/mysql1/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile
make && make install
cd ../
检查下是否安装好sphinx

show engines; 有个sphinx引擎cd csft3_0b2.tar.gz/
CPPFLAGS=-I/usr/include/python2.4
LDFLAGS=-lpython2.4
./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql1
make
make install
cd ../cp /usr/local/sphinx/etc/sphinx.conf.dist /usr/local/sphinx/etc/sphinx.conf

4、创建Sphinx索引文件和MySQL数据文件存放目录

./usr/local/sphinx/bin/indexer test1 --config /usr/local/sphinx/etc/sphinx.conf

/usr/local/mysql1/bin/mysql_install_db --datadir=/usr/local/mysql1/var

5、创建MySQL配置文件
(1)、创建配置文件/mysql/3306/my.cnf

cd mysql-5.1.26-rc/
cp support-files/my-medium.cnf /mysql/3306/my.cnf
vim /mysql/3306/my.cnf
server_id=2(不同于主库和3406)
port=3306

(2)、创建配置文件/mysql/3406/my.cnf
cd mysql-5.1.26-rc/
cp support-files/my-medium.cnf /mysql/3306/my.cnf
vim /mysql/3306/my.cnf
server_id=3(不同于主库和3306)
port=3406
6、制作一份MySQL slave供搜索引擎使用
7、创建快捷启动、停止重启、杀死MySQL进程的脚本
cp support-files/mysqlserver /etc/rc.d/init.d/mysql
vim /etc/rc.d/init.d/mysql
conf=/mysql/3306/my.cnf
$bindir/mysqld_safe --defaults-file=/mysql/3306/my.cnf --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &
二、Sphinx配置

1、生成sphinx中文分词词库
(1)、词典的构造

mmseg -u unigram.txt

该命令执行后,将会产生一个名为unigram.txt.uni的文件,将该文件改名为uni.lib,完成词典的构造。需要注意的是,unigram.txt 必须为UTF-8编码。

(2)、词典文件格式
....
河 187
x:187
造假者 1
x:1
台北队 1
x:1
湖边 1
......

其中,每条记录分两行。其中,第一行为词项,其格式为:[词条]\t[词频率]。需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率需要在 大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。第二行为占位项,是由于 LibMMSeg库的代码是从Coreseek其他的分词算法库(N-gram模型)中改造而来的,在原来的应用中,第二行为该词在各种词性下的分布频 率。LibMMSeg的用户只需要简单的在第二行处填"x:1"即可。

用户可以通过修改词典文件增加自己的自定义词,以提高分词法在某一具体领域的切分精度,系统默认的词典文件在data/unigram.txt中。

(3)、Sphinx+MySQL搜索引擎的中文词库

2、创建Sphinx主索引文件、增量索引文件存放目录
mkdir /usr/local/sphinx/var/data/test1/
mkdir /usr/local/sphinx/var/data/test1stemmed/
3、创建Sphinx配置文件
#in MySQL
CREATE TABLE sphcounter
(
counterid INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);
#创建这张表用来标识上次重建主索引的id位置
# in sphinx.conf
source src1
{
type                    = mysql
sql_host                = localhost
sql_user                = root
sql_pass                = 123
sql_db                    = test
sql_port                = 3306    # optional, default is 3306
sql_sock                = /usr/local/mysql1/var/mysql.sock#以上都是用于连接数据库部分一看就懂
sql_query_pre            = SET NAMES utf8
sql_query_pre            =replace into sphcounter \
select 1,MAX(postid) from pa_gposts  #创建主索引前更改标识位置
sql_query                = \
SELECT postid, title,group_id \
FROM pa_gposts where postid <= \
(select max_doc_id from sphcounter where counterid=1)#主索引是id小于标识位置的部分
sql_attr_uint        = group_id#这个部分不被索引,但可以通过这个属性对结果进行排序
sql_ranged_throttle    = 0#每个查询之前先延迟0ms,也就是不延迟
#sql_query_info        = SELECT * FROM pa_gposts WHERE postid=$id
}
source src1throttled : src1
{
sql_query_pre=set names utf8
sql_query=SELECT postid, title \
FROM pa_gposts where postid >\
(select max_doc_id from sphcounter where counterid=1) #增量索引是id大于标识位置的部分
}
index test1
{
source            = src1 #数据源
path            = /usr/local/sphinx/var/data/test1/test1 #创建索引位置必须有目录/usr/local/sphinx/var/data/test1/
docinfo            = extern
mlock            = 0
min_word_len        = 1
charset_type        =  zh_cn.utf-8#支持中文索引必须为zh_cn.utf-8
charset_dictpath=/root/mmseg-0.7.3/data/ #词典的目录,词典下必须有uni.lib mmseg 生产的词典
min_prefix_len    = 0
min_infix_len        = 1
ngram_len                = 1
ngram_chars = U+4E00..U+9FBF, U+3400..U+4DBF, U+20000..U+2A6DF, U+F900..U+FAFF,\
U+2F800..U+2FA1F, U+2E80..U+2EFF, U+2F00..U+2FDF, U+3100..U+312F, U+31A0..U+31BF,\
U+3040..U+309F, U+30A0..U+30FF, U+31F0..U+31FF, U+AC00..U+D7AF, U+1100..U+11FF,\
U+3130..U+318F, U+A000..U+A48F, U+A490..U+A4CF
html_strip                = 0#不去除HTML标签
#其他的配置如min_word_len,charset_type,ngrams_chars,ngram_len这些则是支持中文检索需要设置的内容。

}
index test1stemmed : test1
{
source                  =src1throttled
path            = /usr/local/sphinx/var/data/test1stemmed/test1stemmed
}
indexer
{
mem_limit            = 256M
}
searchd
{
port                = 3312
log                    = /usr/local/sphinx/var/log/searchd.log
query_log            = /usr/local/sphinx/var/log/query.log
read_timeout        = 5
max_children        = 30
pid_file            = /usr/local/sphinx/var/log/searchd.pid
max_matches            = 1000
seamless_rotate        = 1
preopen_indexes        = 0
unlink_old            = 1
}

4、初始化sphinx中配置的全部索引
/usr/local/sphinx/bin/indexer --all --config /usr/local/sphinx/etc/sphinx.conf
5、创建2个shell脚本,一个用来创建主索引、一个用来创建增量索引(此步可以省略)

1.创建主索引脚本build_main_index.sh
#!/bin/sh
/usr/local/sphinx/bin/searchd --stop>>searchdlog
/usr/local/sphinx/bin/indexer test1 --config /usr/local/sphinx/etc/sphinx.conf>>mainindexlog
/usr/local/sphinx/bin/searchd>>searchdlog
赋予执行权限
chmod u+x build_main_index.sh
定时执行脚本
crontab -e
添加一行 ./root/build_delta_index.sh
2.创建增量索引脚本build_delta_index.sh
#!/bin/sh
/usr/local/sphinx/bin/searchd --stop >> searchdlog
/usr/local/sphinx/bin/indexer test1stemmed --config /usr/local/sphinx/etc/sphinx.conf >> deltaindexlog
/usr/local/sphinx/bin/indexer --merge test1 test1stemmed --config /usr/local/sphinx/etc/sphinx.conf >> deltaindexlog
/usr/local/sphinx/bin/searchd >> searchdlog

6、启动Sphinx守护进程
/usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf
关闭 /usr/local/sphinx/bin/searchd --config /usr/local/sphinx/etc/sphinx.conf --stop
7、配置服务器开机启动时需要自动执行的命令
8、创建Sphinx存储引擎表
CREATE TABLE `sphinx` (
`id` int(11) NOT NULL,
`weight` int(11) NOT NULL,
`query` varchar(255) NOT NULL,
`group_id` int(11) NOT NULL,
KEY `Query` (`Query`)
) ENGINE=SPHINX CONNECTION='sphinx://localhost:3312/test1';
与一般mysql表不同的是ENGINE=SPHINX CONNECTION='sphinx://localhost:3312/test1';,这里表示这个表采用SPHINXSE引擎,与sphinx的连接串是'sphinx://localhost:3312/test1,test1是索引名称
根据sphinx官方说明,这个表必须至少有三个字段,字段起什么名称无所谓,但类型的顺序必须是integer,integer,varchar,分别表示记录标识document ID,匹配权重weight与查询query,同时document ID与query必须建索引。另外这个表还可以建立几个字段,这几个字段的只能是integer或TIMESTAMP类型,字段是与sphinx的结果集绑定的,因此字段的名称必须与在sphinx.conf中定义的属性名称一致,否则取出来的将是Null值。

比如我在上面有定义了sql_attr_uint= group_id那么在这个表里头,你就可以再定义group_id字段。

三、如何通过SQL语句调用搜索引擎
1。简单的查询
select * from sphinx where query='动画';
2。联合查询:
select docs.title from test.pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='制作;limit=1000';

query='关键字' ,关键字就是你要搜索的关键字,如query='CGArt'表示你要全文搜索CGArt

mode,搜索模式,值有:all,any,phrase,boolean,extended,默认是all
all, 匹配所有查询词(默认模式)
any, 匹配查询词中的任意一个
phrase, 将整个查询看作一个词组,要求按顺序完整匹配
boolean, 将查询看作一个布尔表达式 (参见 节 4.2, “布尔查询语法”)
extended, 将查询看作一个 Sphinx 内部查询语言的表达式(参见节 4.3, “扩展的查询语法”)

sort,排序模式,必须是relevance,attr_desc,attr_asc,time_segments,extended中的一种,在所有模式中除了relevance外,
属性名(或用extended排序)前面都需要一个冒号。
... where query='test;sort=attr_asc:group_id';按照group_id升序排序
... where query='test;sort=extended:@weight desc,group_id asc';
relevance 模式, 按相关度降序排列(最好的匹配排在最前面)
attr_desc 模式, 按属性降序排列 (属性值越大的越是排在前面)
attr_asc 模式, 按属性升序排列(属性值越小的越是排在前面)
time_segments 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序
extended 模式, 按一种类似 SQL 的方式将列组合起来,升序或降序排列。
RELEVANCE 忽略任何附加的参数,永远按相关度评分排序。所有其余的模式都要求额外的排序子句,子句的语法跟具体的模式有关。
ATTR_ASC,ATTR_DESC 以及 TIME_SEGMENTS 这三个模式仅要求一个属性名。
RELEVANCE 模式等价于在扩展模式中按"@weight DESC, @id ASC"排序,
ATTR_ASC 模式等价于"attribute ASC, @weight DESC, @id ASC",而
ATTR_DESC 等价于"attribute DESC, @weight DESC, @id ASC"。
TIME_SEGMENTS 模式 在 TIME_SEGMENTS 模式中,属性值被分割成“时间段”,然后先按时间段排序,再按相关度排序。
EXTENDED 模式 在 EXTENDED 模式中,您可以指定一个类似 SQL 的排序表达式,但涉及的属性(包括内部属性)不能超过 5 个,例如:
@relevance DESC, group_id ASC, @id DESC
已知的内部属性:
@id (match ID)
@weight (match weight)
@rank (match weight)
@relevance (match weight)
@rank 和@relevance 只是@weight 的额外别名。

offset,结果记录集的起始位置,默认是0

limit,从结果记录集中取出的数量,默认是20条

index,要搜索的索引名称
... where query='test;index=test1';
... where query='test;index=test1,test2,test3;';

minid,maxid,匹配最小与最大文档ID
weights,以逗号分割的分配给sphinx全文检索字段的权重列表
... where query='test;weights=1,2,3;';
filter,!filter,以逗号分隔的属性名与一堆要匹配的值
#只包括1,5,19的组
... where query='test;filter=group_id,1,5,19;';
#不包括3,11的组
... where query='test;!filter=group_id,3,11';
range,!range,逗号分隔的属性名一最小与最大要匹配的值
#从3至7的组
... where query='test;range=group_id,3,7;';
#不包括从5至25的组
... where query='test;!range=group_id,5,25;';
maxmatches,每个查询最大匹配的值
... where query='test;maxmatches=2000;';
groupby,group by 方法与属性
... where query='test;groupby=day:published_ts;';
... where query='test;groupby=attr:group_id;';
groupsort,group by 的排序
... where query='test;gropusort='@count desc';

select count(*) from pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='动画;limit=1000';

搜索标题包含动画
select count(*) from pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='@title动画;limit=100000;mode=extended';

四、添加分词的操作及效果
1.添加分词儿童动画片
select docs.title from pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='儿童动画片;limit=100000';
+--------------------------------------------------------------------------------------------------+
| title                                                                                            |
+--------------------------------------------------------------------------------------------------+
| 儿童动画片儿童影视/动画连续剧  迅雷下载集                                     |
| 发精彩儿童动画片10部,下载从速                                                     |
| 【儿童节专题】【17部经典动画片下载,附名单】                                  |
| <span style="color:red">[图]</span>儿童安全教育动画片《平安》                      |
| 十五部国产儿童动画片下载                                                             |
| 推荐不用注册就能下载数千首儿童歌曲、动画片、游戏、故事等育儿资源 |
| 求儿童动画片                                                                               |
| 儿童歌曲、儿童故事、儿童动画片下载                                              |
| 儿童动画片--童话合集23部                                                               |
+--------------------------------------------------------------------------------------------------+
9 rows in set (0.00 sec)
没添加之前被分割成儿童/动画片

vim unigram.txt    添加下面2行(参见2.1.2词典的格式)
儿童动画片 1
x:1
(附)查看分词
mmseg -d <dict_dir> tobe_segment.txt
其中,命令使用‘-d’开关指定词库文件所在的位置,参数dict_dir为词库文件(uni.lib )所在的目录;tobe_segment.txt 为待切分的文本文件,必须为UTF-8编码。如果一切正确,mmseg会将切分结果以及所花费的时间显示到标准输出上。
mmseg -d mmseg-0.7.3/data a
论坛/x 里/x 有/x 没有/x 迪/x 斯/x 尼/x 的/x 小公/x 主/x 动画片/x ,/x 睡/x 美人/x ,/x 阿/x 拉丁/x ,/x 灰姑娘/x
2。生成字典
mmseg -u unigram.txt uni.lib
3。重启服务器重建索引
mysql restart 因为mysql的告诉缓存所以要重启mysql

bin/searchd --stop

bin/indexer test1

bin/searchd
4。查看结果
mysql> select docs.title from pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='儿童动画片;limit=100000';
+--------------------------------------------------------------+
| title                                                        |
+--------------------------------------------------------------+
| 发精彩儿童动画片10部,下载从速                 |
| 十五部国产儿童动画片下载                         |
| 儿童动画片儿童影视/动画连续剧  迅雷下载集 |
| 求儿童动画片                                           |
| 儿童歌曲、儿童故事、儿童动画片下载          |
| 儿童动画片--童话合集23部                           |
+--------------------------------------------------------------+
6 rows in set (0.06 sec)

添加之后只搜出儿童动画片

五、增量索引测试

1。原始数据
mysql> select docs.title from pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='词典;limit=100000';
+-----------------------------------------------------------------------------+
| title                                                                       |
+-----------------------------------------------------------------------------+
| 孕妇小词典                                                             |
| 征婚魔鬼词典                                                          |
| 和大家分享一个很棒的在线学习词典,对小孩很有帮助的 |
| [转贴]女人流行词典                                                  |
| 你不得不看的魔鬼词典                                              |
+-----------------------------------------------------------------------------+
5 rows in set (0.13 sec)
insert into pa_gposts (title) values('词典的构造');
bin/searchd --stop
2。创建增量索引
bin/indexer test1stemmed --config /usr/local/sphinx/etc/sphinx.conf
3。合并索引
bin/indexer --merge test1 test1stemmed --config /usr/local/sphinx/etc/sphinx.conf
bin/searchd
4。查看结果
mysql> select docs.title from pa_gposts docs join sphinx on (docs.postid=sphinx.id) where query='词典;limit=100000';
+-----------------------------------------------------------------------------+
| title                                                                       |
+-----------------------------------------------------------------------------+
| 孕妇小词典                                                             |
| 征婚魔鬼词典                                                          |
| 和大家分享一个很棒的在线学习词典,对小孩很有帮助的 |
| [转贴]女人流行词典                                                  |
| 你不得不看的魔鬼词典                                              |
| 词典的构造                                                             |
+-----------------------------------------------------------------------------+
6 rows in set (0.08 sec)

Sphinx全文索引安装教程

首先了解一下sphinx全文索引的相关知识
官方网站http://www.sphinxsearch.com/
官方文档:http://www.sphinxsearch.com/docs/
中文支持:http://www.coreseek.cn/
中文使用手册下载http://www.coreseek.cn/uploads/pdf/sphinx_doc_zhcn_0.9.pdf

基本上看看上面的官方教程和中文使用手册,你应该会安装和使用Sphix全文索引,当然,还有一些细节,需要不断的google和baidu,那为了节省大家的时间,就出一个完整的Sphinx安装教程和结合PHPWIND程序的使用教程(PHPWIND7.5版本支持)。

接下来开始Sphinx的技术之旅吧!

考虑到Sphinx全文索引使用的实际需要,主要介绍Sphinx全文索引中文方面的支持。
这里需要感谢李沫南同学对Sphinx全文索引中文支持的贡献!

一,Windows下安装Sphinx

1,开始前的准备工作
来源:http://www.coreseek.cn/products/ft_down/
下载csft3.1:http://www.coreseek.cn/uploads/csft/3.1/win32/csft3.1.bin.zip
下载标准词库:http://www.coreseek.cn/uploads/csft/3.1/data.zip
解压:csft3.1.bin.zip 如下目录,解压在C:\csft3.1目录下
解压:data.zip,解压在C:\csft3.1\data目录下 [分词包]

 

需要新建log文件夹

(1)复制    C:\csft3.1\conf\csft.conf.in    文件到    C:\csft3.1\bin\    目录下,并重命名为csft.conf
注意csft.conf文件里的类似:path = @CONFDIR@/data/test1
把@CONFDIR@替换为C:\csft3.1\ 如上更改为:path = C:\csft3.1\ data\test1

(2)把测试数据    C:\csft3.1\conf\example.sql    导入数据库 [这个基本都会吧!]

(3)建立索引,在DOC界面下运行:indexer.exe --all 如下图,

 

如果执行上面的命令时,提示找不到python.dll找不到的话,请安装python2.5即可,windows下的安装文件下载地址:http://www.python.org/ftp/python/2.5/python-2.5.msi

建立索引过程需要仔细检查csft.conf数据库配置是否正确。如下:
sql_host               = localhost    #数据库主机地址
sql_user               = test  #数据库用户名,拥有数据库所有权限
sql_pass               =
sql_db                  = test   #数据库名
sql_port                = 3306 #可用端口,一般不需要更改

其它配置使用默认,先体验下sphinx全文索引功能。

(4)测试搜索是否正常,运行:search.exe test 如下图



测试正常将返回

(5)开启搜索进程服务,运行:searchd.exe 如下图


这样就能提供sphinx全文索引的搜索服务了,以上就是一个简单的操作过程,如果需要支持中文索引,就需要配置相应的参数,具体请查看中文使用手册。为了便于大家了解相关配置,可查看PHPWind程序支持Sphinx全文索引的配置文件,大家可边对照手册边了解[中文支持具体请看linux安装部分]。

附:PHPWind程序支持Sphinx全文索引的配置。

Windows下安装Sphix使用csft非常简单,如果大家有兴趣可从sphinx[www.sphinxsearch.com]官方下载安装,不过有点复杂,这里就不介绍了,高手们慢慢体验。

二,linux下安装Sphinx全文索引,以CentOS 5.3为例

只能说windows下安装sphinx只是为了体验,因为linux下安装sphinx才是正道。
为了详细体验Centos下安装Sphinx,重新安装Centos系统,完整体验Sphinx安装过程。
Coreseek 全文检索服务器版本已经集成sphinx和中文分词补丁,只需要下载MMSeg和Coreseek Fulltext Server(源代码),就能实现Sphinx服务支持。
下载地址:http://www.coreseek.cn/products/ft_down/

推荐源代码安装

1,开始前的准备工作 [如果已经安装就不需要,如果下面列表没有还有其它的请补上]
1)安装mysql
2)安装php
3)安装apache
4)安装python
5)安装libiconv
6)安装gcc-c++
7)下载Coreseek Fulltext Server(源代码):http://www.coreseek.cn/uploads/csft/3.1/Source/csft-3.1.tar.gz
8)下载Coreseek Mmseg(源代码):http://www.coreseek.cn/uploads/csft/3.1/Source/mmseg-3.1.tar.gz

执行如下命令
yum install python python-dev

2,安装步骤
(1)下载CSFT与MMseg
#wget http://www.coreseek.cn/uploads/csft/3.1/Source/mmseg-3.1.tar.gz
#wget http://www.coreseek.cn/uploads/csft/3.1/Source/csft-3.1.tar.gz

(2)安装MMseg中文分词
# pwd
/usr/local [知道当前的安装目录]
# wget http://www.coreseek.cn/uploads/csft/3.1/Source/mmseg-3.1.tar.gz
# tar xzvf mmseg-3.1.tar.gz
# mkdir /usr/local/mmseg
# cd mmseg-3.1
# ./configure --prefix=/usr/local/mmseg
# make
# make install

运行如下,看看mmseg是否安装成功
# /usr/local/mmseg/bin/mmseg
Coreseek COS(tm) MM Segment 1.0
Copyright By Coreseek.com All Right Reserved.
Usage: /usr/local/mmseg/bin/mmseg <option> <file>
-u <unidict>           Unigram Dictionary
-r           Combine with -u, used a plain text build Unigram Dictionary, default Off
-b <Synonyms>           Synonyms Dictionary
-h            print this help and exit

(3)安装csft-3.1
# pwd
/usr/local
# wget http://www.coreseek.cn/uploads/csft/3.1/Source/csft-3.1.tar.gz
# tar xzvf csft-3.1.tar.gz
# mkdir /usr/local/csft
# cd csft-3.1
# ./configure --prefix=/usr/local/csft --with-mmseg=/usr/local/mmseg/bin/mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/
# make
# make install

这里make的时候可能出错,解决如下:
1,检查环境是否安装如下软件
# yum install mysql mysql-devel php-mysql qt4-mysql   [mysql环境要首先安装]
# yum install python python-dev

2,是否安装libiconv
下载地址:http://savannah.gnu.org/projects/libiconv/

3,如果还有错误,打开src/Makefile文件,进行修改
# vi src/Makefile 找到182行


LIBS = -lm -lz -lexpat  -L/usr/local/lib -lpthread
LIBS = -lm -lz -lexpat -liconv -L/usr/local/lib -lpthread

这样,如果一切顺利,就开始配置你的sphinx全文索引服务器吧[如果安装有什么问题,欢迎在PHPWind官方提问]!

3,按下来就是配置
#cp /usr/local/csft/etc/sphinx-min.conf.dist /usr/local/csft/etc/sphinx.conf
修改sphinx.conf文件中的数据库参数配置,方法同windows下一样
sql_host                = localhost
sql_user                = root
sql_pass               =
sql_db                  = test

4,把体验数据/usr/local/csft/etc/example.sql 导入到数据库 [这一步应该都会]
5,新建索引
# /usr/local/csft/bin/indexer --all

6,测试搜索
# /usr/local/csft/bin/search test
如果测试有返回,恭喜你的sphinx全文索引服务器配置成功

7,接下来就是支持中文的配置和实现

UTF8编码实例 [如果已经存在utf8的数据库就不需要新建,这里只是举例]
1)创建一个新的数据库,注意编码为utf8_general_ci,如phpwind
2)导入部分现有的GBK数据,如pw_threads
3)配置csft.conf如下
source数据源部分
sql_host                = localhost
sql_user                  = root
sql_pass                 =
sql_db                     = phpwind
sql_query_pre         = SET NAMES utf8
sql_query_pre         = SET SESSION query_cache_type=OFF
sql_query                = SELECT tid,fid,authorid,subject FROM pw_threads
sql_attr_uint            = fid
sql_attr_uint            = authorid

索引部分
charset_type            = zh_cn.utf-8
charset_dictpath       = /usr/local/csft/
min_prefix_len           = 0
min_infix_len             = 0
min_word_len            = 2

4)创建数据词典
#pwd
/usr/local/mmseg-3.1/data   [这是你解压mmseg的目录下的data]
运行如下命令
# mmseg -u unigram.txt
# ll
总计 10152
-rwxr-xr-x 1 root root     715 06-06 18:40 build_unigram.py
-rwxr-xr-x 1 root root   32674 06-06 18:40 char.stat.txt
-rwxr-xr-x 1 root root 1051268 06-06 18:40 Lexicon_full_words.txt
-rwxr-xr-x 1 root root 1826251 06-06 18:40 unigram.txt
-rw-r--r-- 1 root root 3729280 09-16 20:20 unigram.txt.uni

将会生成 unigram.txt.uni  文件
# mv unigram.txt.uni  uni.lib
# cp uni.lib /usr/local/csft/  [这就是上面我们在配置索引中用的charset_dictpath]

其它的默认不变,如上方法创建索引
# /usr/local/csft/bin/indexer --all

测试是否成功
# /usr/local/csft/bin/search 测试

以上就是utf8编码的全文索引实现过程

GBK编码实例

与utf8一样,区别在于数据库和数据表使用gbk编码
同时只需要修改如下配置部分[csft.conf]

source数据源部分
sql_query_pre     = SET NAMES gbk

索引部分
charset_type            = zh_cn.gbk

这里需要注意一下,如果要想测试支持gbk,可以写一个PHP文件,调用sphinx提供的api接口,注意要开启searchd进程

# /usr/local/csft/bin/searchd

编写如下代码 [注意要与sphinxapi.php目录存放在一个目录]
sphinxapi.php目录在# /usr/local/csft-3.1/api/下
也可以直接使用api目录下的test.php直接测试
<?php
require_once 'sphinxapi.php';
$sc = new SphinxClient();
$sc->SetServer('127.0.0.1',3312);
$sc->SetConnectTimeout(1);
$sc->SetWeights(array(100,1));
$sc->SetMatchMode(SPH_MATCH_ALL);
$sc->SetArrayResult(TRUE);
$res = $sc->query("简单");
var_dump($res);
?>

也可以直接运行search工具[utf8版],如下


[root@localhost ~]# /usr/local/csft/bin/search 便宜
Coreseek Full Text Server 3.1
Copyright (c) 2006-2008 coreseek.com
using config file '/usr/local/csft/etc/csft.conf'...
index 'test1': query '便宜 ': returned 4 matches of 4 total in 0.015 sec

displaying matches:
1. document=3, weight=1, fid=7, authorid=1
2. document=97, weight=1, fid=35, authorid=1
3. document=108, weight=1, fid=32, authorid=1
4. document=146, weight=1, fid=7, authorid=1

words:
1. '便宜': 4 documents, 4 hits

如果返回false,请检查searchd进程是否开启,如果返回成功,恭喜,你已经成为sphinx的使用者,向下一个高层次进军吧!

三,后记
其实很想制作一个安装视频教程,但由于时间有限,在安装过程中肯定会存在一些细节上的问题,只要大家按照上面的步骤一步一步安装,相信能把sphinx拿下,如果有什么问题
大家可查看http://www.sphinxsearch.com/http://www.coreseek.cn/网站获取更多帮助,同时也可以查看中文手册。

同时也可以在phpwind官方网站www.phpwind.net提问和分享你的安装过程,把一个细节都亮出来,帮助别人也帮助自己。BY liuhui.php@gmail.com 2009-9-17

其它链接
用 PHP 构建自定义搜索引擎
http://www.ibm.com/developerworks/cn/opensource/os-php-sphinxsearch/index.html

MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm
http://technology.chtsai.org/mmseg/

附phpwind配置实例[gbk版]
PHPWind搜索sphinx配置实例 [修改部分参数就可直接应用于phpwind程序]

部分解读:
如下全文索引使用的是主索引+增量索引的方式,具体大家结合手册了解相关知识

需要创建一张表 [编码自己定,如下是gbk]
CREATE TABLE IF NOT EXISTS `search_counter` (
`counterid` int(11) NOT NULL DEFAULT '0',
`max_doc_id` int(11) NOT NULL DEFAULT '0',
`min_doc_id` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`counterid`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

csft.conf配置文件

source tmsgs
{
type                                    = mysql
sql_host                                = localhost
sql_user                                = root
sql_pass                                = xxxx
sql_db                                  = phpwind
sql_port                                = 3307  # optional, default is 3306
sql_sock                                = /tmp/mysql3307.sock
sql_query_pre                           = SET NAMES gbk
sql_query_pre                           = SET SESSION query_cache_type=OFF
sql_query_pre                           = REPLACE INTO search_counter SELECT 1,MAX(tid),MIN(tid) FROM pw_tmsgs
sql_query_range                    = SELECT min_doc_id, max_doc_id FROM search_counter WHERE counterid = 1
sql_range_step                          = 1000
sql_query                               = SELECT th.tid,th.subject,th.authorid,th.postdate,th.lastpost,th.fid,th.digest,th.hits,th.replies,t.content FROM pw_threads th  LEFT JOIN pw_tmsgs t USING(tid) WHERE th.tid > $start AND th.tid <= $end

sql_attr_uint                           = authorid
sql_attr_uint                           = hits
sql_attr_uint                           = replies
sql_attr_uint                           = fid
sql_attr_timestamp                      = postdate
sql_attr_timestamp                      = lastpost
sql_attr_uint                           = digest
}

source addtmsgs
{
type                                    = mysql
sql_host                                = localhost
sql_user                                = root
sql_pass                                = xxxx
sql_db                                  = phpwind
sql_port                                = 3307  # optional, default is 3306
sql_sock                                = /tmp/mysql3307.sock
sql_query_pre                           = SET NAMES gbk
sql_query_pre                           = SET SESSION query_cache_type=OFF
sql_query_range                    = SELECT max_doc_id, max_doc_id+100000 FROM search_counter WHERE counterid = 1
sql_range_step                          = 100000
sql_query                               = SELECT th.tid,th.subject,th.authorid,th.postdate,th.lastpost,th.fid,th.digest,th.hits,th.replies,t.content FROM pw_threads th  LEFT JOIN pw_tmsgs t USING(tid) WHERE th.tid > $start AND th.tid <= $end

sql_attr_uint                           = authorid
sql_attr_uint                           = hits
sql_attr_uint                           = replies
sql_attr_uint                           = fid
sql_attr_timestamp                      = postdate
sql_attr_timestamp                      = lastpost
sql_attr_uint                           = digest
sql_query_post                         = REPLACE INTO search_counter SELECT 1,MAX(tid),MIN(tid) FROM pw_tmsgs
#sql_attr_uint                          = tid
}

source threads
{
type                                    = mysql
sql_host                                = localhost
sql_user                                = root
sql_pass                                = xxxxxxx
sql_db                                  = phpwind
sql_port                                = 3307  # optional, default is 3306
sql_sock                                = /tmp/mysql3307.sock
sql_query_pre                           = SET NAMES gbk
sql_query_pre                           = SET SESSION query_cache_type=OFF
sql_query_pre                           = REPLACE INTO search_counter SELECT 3,MAX(tid),MIN(tid) FROM pw_threads
sql_query_range                    = SELECT min_doc_id, max_doc_id FROM search_counter WHERE counterid = 3
sql_range_step                          = 1000
sql_query                               = SELECT th.tid,th.subject,th.authorid,th.postdate,th.lastpost,th.fid,th.digest,th.hits,th.replies FROM pw_threads th  WHERE th.tid > $start AND th.tid <= $end
sql_attr_uint                           = authorid
sql_attr_uint                           = hits
sql_attr_uint                           = replies
sql_attr_uint                           = fid
sql_attr_timestamp                      = postdate
sql_attr_timestamp                      = lastpost
sql_attr_uint                           = digest
}

source addthreads
{
type                                    = mysql
sql_host                                = localhost
sql_user                                = root
sql_pass                                = xxx
sql_db                                  = phpwind
sql_port                                = 3307  # optional, default is 3306
sql_sock                                = /tmp/mysql3307.sock
sql_query_pre                           = SET NAMES gbk
sql_query_pre                           = SET SESSION query_cache_type=OFF
sql_query_range                    = SELECT max_doc_id, max_doc_id+100000 FROM search_counter WHERE counterid = 3
sql_range_step                          = 100000
sql_query                               = SELECT th.tid,th.subject,th.authorid,th.postdate,th.lastpost,th.fid,th.digest,th.hits,th.replies FROM pw_threads th  WHERE th.tid > $start AND th.tid <= $end

sql_attr_uint                           = authorid
sql_attr_uint                           = hits
sql_attr_uint                           = replies
sql_attr_uint                           = fid
sql_attr_timestamp                      = postdate
sql_attr_timestamp                      = lastpost
sql_attr_uint                           = digest
sql_query_post                         = REPLACE INTO search_counter SELECT 3,MAX(tid),MIN(tid) FROM pw_threads
#sql_attr_uint                          = tid
}

index tmsgsindex
{
source                                  = tmsgs
path                                    = /usr/local/csft/var/data/tmsgs
docinfo                                 = extern
charset_type                            = zh_cn.gbk
#min_prefix_len  = 0
#min_infix_len  = 2
#ngram_len = 2
charset_dictpath                        = /usr/local/csft/
min_prefix_len                          = 0
min_infix_len                           = 0
min_word_len                            = 2
}

index addtmsgsindex
{
source                                  = addtmsgs
path                                    = /usr/local/csft/var/data/addtmsgs
docinfo                                 = extern
charset_type  = zh_cn.gbk
#min_infix_len  = 2
#ngram_len = 2
charset_dictpath                    = /usr/local/csft/
min_prefix_len                        = 0
min_infix_len                          = 0
min_word_len                         = 2
}
index threadsindex
{
source                                  = threads
path                                    = /usr/local/csft/var/data/threads
docinfo                                 = extern
charset_type                            = zh_cn.gbk
#min_prefix_len  = 0
#min_infix_len  = 2
#ngram_len = 2
charset_dictpath                        = /usr/local/csft/
min_prefix_len                          = 0
min_infix_len                           = 0
min_word_len                            = 2
}

index addthreadsindex
{
source                                  = addthreads
path                                    = /usr/local/csft/var/data/addthreads
docinfo                                 = extern
charset_type  = zh_cn.gbk
#min_infix_len  = 2
#ngram_len = 2
charset_dictpath                    = /usr/local/csft/
min_prefix_len                        = 0
min_infix_len                          = 0
min_word_len                         = 2
}
indexer
{
mem_limit                               = 128M
}

searchd
{
port                                = 3312
log                                 = /usr/local/csft/var/log/searchd.log
query_log                           = /usr/local/csft/var/log/query.log
read_timeout                        = 5
max_children                        = 30
pid_file                                = /usr/local/csft/var/log/searchd.pid
max_matches                         = 1000
seamless_rotate                     = 1
preopen_indexes                     = 0
unlink_old                          = 1
}