一,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 如下图,
建立索引过程需要仔细检查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
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
-u Unigram Dictionary
-r Combine with -u, used a plain text build Unigram Dictionary, default Off
-b 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直接测试
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/developerwork … nxsearch/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
}
第三步:测试
首先,索引:使用bin目录下的indexer,执行:indexer -c 配置文件的路径 index名称
# /usr/local/coreseek/bin/indexer -c etc/csft.conf --all ##--all表示全部索引 ##Windows下面为bin\indexer -c etc\csft.conf --all ##以下为正常索引全部数据时的提示信息:部分数据信息根据实际数据情况变化 Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)] Copyright (c) 2007-2010, Beijing Choice Software Technologies Inc (http://www.coreseek.com) using config file 'etc/csft.conf'... indexing index '索引名称'... collected 3 docs, 0.0 MB sorted 0.0 Mhits, 100.0% done total 3 docs, 7585 bytes total 0.075 sec, 101043 bytes/sec, 39.96 docs/sec total 2 reads, 0.000 sec, 5.6 kb/call avg, 0.0 msec/call avg total 7 writes, 0.000 sec, 3.9 kb/call avg, 0.0 msec/call avg如果出现以上对应的提示,则表示配置正确,可以正常索引;
随后,启动搜索:使用bin目录下的searchd,执行:searchd -c 配置文件的路径 --console
# /usr/local/coreseek/bin/searchd -c etc/csft.conf --console ##Windows下面为bin\searchd -c etc\csft.conf --console ##以下为正常开启搜索服务时的提示信息:其中的port可以在配置文件中修改 Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)] Copyright (c) 2007-2010, Beijing Choice Software Technologies Inc (http://www.coreseek.com) using config file 'etc/csft.conf'... listening on all interfaces, port=9312如要继续测试搜索功能,请不要停止searchd,否则其他程序将无法连接到搜索服务端
BSD/Linux环境下,测试成功后:
如要后台运行服务,则使用:searchd -c 配置文件的路径,将searchd作为后台服务运行;
如果要停止后台服务,则使用:searchd -c 配置文件的路径 --stop;
如果要更新后台服务的索引,则使用:indexer -c 配置文件的路径 index名称
然后,可以参考 安装测试说明文档使用bin目录下的search进行测试,检查搜索是否可以正常进行;
如果要将搜索结果应用到自己的程序之中,请使用api目录下对应的api接口测试。PHP接口的测试如下:
//注意文件的编码格式需要保存为为UTF-8格式 require ( "sphinxapi.php" ); $cl = new SphinxClient (); $cl->SetServer ( '127.0.0.1', 9312); //以下设置用于返回数组形式的结果 $cl->SetArrayResult ( true ); /* //ID的过滤 $cl->SetIDRange(3,4); //sql_attr_uint等类型的属性字段,需要使用setFilter过滤,类似SQL的WHERE group_id=2 $cl->setFilter('group_id',array(2)); //sql_attr_uint等类型的属性字段,也可以设置过滤范围,类似SQL的WHERE group_id2>=6 AND group_id2<=8 $cl->SetFilterRange('group_id2',6,8); */ //取从头开始的前20条数据,0,20类似SQl语句的LIMIT 0,20 $cl->SetLimits(0,20); //在做索引时,没有进行 sql_attr_类型 设置的字段,可以作为“搜索字符串”,进行全文搜索 $res = $cl->Query ( '搜索字符串', "*" ); //"*"表示在所有索引里面同时搜索,"索引名称"则表示搜索指定的 //如果需要搜索指定全文字段的内容,可以使用扩展匹配模式: //$cl->SetMatchMode(SPH_MATCH_EXTENDED); //$res->cl->Query( '@title 测试' , "*") echo '<pre>'; print_r($res['matches']); print_r($res); echo '</pre>';
返回结果之中(可见本页面最后的”搜索结果示例“),将包含match和word部分,match部分表示搜索到的结果,word部分表示搜索字符串的切分结果,total表示搜索到的结果总数;
如果total为0,可以print_r($cl)查看搜索服务器是否返回了错误提示信息,或者检查搜索字符串是否真的可以匹配信息。
match之中,包含了获取到的数据的ID信息,以及所包含的整数字段的属性信息,根据ID信息,可以从数据库之中,取到对应的原始数据的信息,以供页面显示或者其他程序使用;
MySQL读取示例: SELECT * FROM 数据表 WHERE ID IN(id1,id2,id3...,idn)
具体的搜索API,还包括排序、过滤等,可以访问 Coreseek/Sphinx(0.9)中文手册了解API详情和具体的使用方式。
然后,你就可以在你的其他用用之中,包含以上的代码,并根据自己的需要,将用户或者其他代码传递的参数应用到搜索上面来,并根据返回的结果获取对应的数据进行显示或者处理!
搜索结果示例: Array ( [error] => 【本次查询的错误信息】 [warning] => [status] => 0 [fields] => Array ( [0] => title [1] => content ) [attrs] => Array ( [published] => 2 [author_id] => 1 [a] => 1 ) [matches] => Array 【匹配到的文档信息】 ( [0] => Array ( [id] => 3 【文档的ID】 [weight] => 1680 [attrs] => Array ( [published] => 1270094460 [author_id] => 2 [a] => 0 ) ) ) [total] => 1 【本次查询返回的结果数目,例如翻页等使用】 [total_found] => 1 【整个系统包含的结果数目】 [time] => 0.136 【查询使用的时间】 [words] => Array 【分词结果】 ( [服务器] => Array ( [docs] => 1 【该词汇匹配到的文档数目】 [hits] => 1 【该词汇出现的次数】 ) ) )