sphinx 安装
Sphinx在mysql上的应用有两种方式:
1. 采用API调用,如使用PHP、java等的API函数或方法查询。优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用;缺点是如已有搜索程序的条件下,需修改部分程序。推荐程序员使用。
2. 使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索。其特点是,在sql端方便组合,且能直接返回数据给客户端。不必二次查询,在程序上仅需要修改对应的sql,但这对使用框架开发的程序很不方便,比如使用了ORM。另外还需要对mysql进行重新编译,且需要mysql-5.1以上版本支持插件存储。
这里的安装主要介绍的是第一种通过api调用的方式。Sphinx的安装如下:
代码如下 | 复制代码 |
#下载最新稳定版 wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz tar xzvf sphinx-0.9.9.tar.gz cd sphinx-0.9.9 ./configure --prefix=/usr/local/sphinx/ --with-mysql --enable-id64 make make install |
注意:采用这种方式安装不支持中文分词。
三、 Sphinx中文分词中文的全文检索和英文等latin系列不一样,后者是根据空格等特殊字符来断词,而中文是根据语义来分词。中文分词主要有2个插件
1. Coreseek
Coreseek是现在用的最多的sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg ,是基于sphinx的基础上开发的。
2. sfc(Sphinx-for-chinese)
sfc(sphinx-for-chinese)是由网友happy兄提供的另外一个中文分词插件。其中文词典采用的是xdict。
本节主要介绍Coreseek的安装方法
四、 Coreseek(支持中文检索的sphinx)安装1. 安装升级autoconf
因为coreseek需要autoconf 2.64以上版本,因此需要升级autoconf,不然会报错从http://download.chinaunix.net/download.php?id=29328&ResourceID=648下载autoconf-2.64.tar.bz2,安装方法如下:
代码如下 | 复制代码 |
tar -jxvf autoconf-2.64.tar.bz2 cd autoconf-2.64 ./configure make make install |
2. 下载coreseek
新版本的coreseek将词典和sphinx源程序放在了一个包中,因此只需要下载coreseek包就可以了。
wget http://www.wapm.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz
3. 安装mmseg(coreseek所使用的词典)
代码如下 | 复制代码 |
tar xzvf coreseek-3.2.14.tar.gz cd mmseg-3.2.14 ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决 ./configure --prefix=/usr/local/mmseg3 make && make install cd .. |
4. 安装coreseek(sphinx)
代码如下 | 复制代码 |
cd csft-3.2.14 sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决 ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql make && make install cd .. |
5. 测试mmseg分词和coreseek搜索
备注:需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文,我的系统字符集为en_US.UTF-8也是可以的。
代码如下 | 复制代码 |
cd testpack cat var/test/test.xml #此时应该正确显示中文 /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml /usr/local/coreseek/bin/indexer -c etc/csft.conf --all /usr/local/coreseek/bin/search -c etc/csft.conf |
网络搜索
此时正确的应该返回
words:
1. '网络': 1 documents, 1 hits
2. '搜索': 2 documents, 5 hits
6. 生成 mmseg词库及配置文件
新版本的已经自动生成。
sphinx api 的完整用法及重要属性,整理一下,以防忘记!
代码如下 | 复制代码 |
$cl = new SphinxClient (); //安装的默认host:localhost ,sphinx端口:3312 $cl->SetServer ( "localhost", "3312"); //可选,为每一个全文检索字段设置权重,主要根据你在sql_query中定义的字段的顺序,Sphinx系统以后会调整,可以按字段名称来设定权重. 可以参考SetFieldWeights(array ( 100, 1 )) $cl->SetWeights ( array ( 100, 1 ) ); //查询的模式,总共有以下模式:SPH_MATCH_ALL,匹配所有查询词(and)(默认模式)SPH_MATCH_ANY, 匹配查询词中的任意一个(or)SPH_MATCH_PHRASE, 将整个查询看作一个词组,要求按顺序完整匹配SPH_MATCH_BOOLEAN, 将查询看作一个布尔表达式 SPH_MATCH_EXTENDED, 将查询看作一个 Sphinx 内部查询语言的表达式 。还有一个特殊的“完整扫描”模式,当如下条件满足时,该模式被自动激活: //1. 查询串是空的(即长度为零) //2.docinfo存储方式为 extern在完整扫描模式中,全部已索引的文档都被看作是匹配的。这类匹配仍然会被过滤、排序或分组,但是并不会做任何真正的全文检索。这种模式可以用来统一全文检索和非全文检索的代码,或者减轻SQL 服务器的负担(有些时候 Sphinx 扫描的速度要优于类似的 MySQL 查询) $cl->SetMatchMode ( "SPH_MATCH_ALL" ); //只搜索forum_id=1或3或7 如果$cl->SetFilter ( "forum_id", array ( 1,3,7 ) ,true); 表示只搜索forum_id!=1或!=2或!=7 $cl->SetFilter ( "forum_id", array ( 1,3,7 ) ); //SPH_GROUPBY_DAY,从时间戳中按 YYYYMMDD 格式抽取年、月、日 //SPH_GROUPBY_WEEK,从时间戳中按 YYYYNNN 格式抽取年份和指定周数(自年初计起)的第一天 //SPH_GROUPBY_MONTH,从时间戳中按 YYYYMM 格式抽取月份 //SPH_GROUPBY_YEAR,从时间戳中按 YYYY 格式抽取年份 //最终的搜索结果中每组包含一个最佳匹配。分组函数值和每组的匹配数目分别以“虚拟”属性@group 和@count 的形式返回。 //SPH_SORT_RELEVANCE忽略任何附加的参数,永远按相关度评分排序。所有其余的模式都要求额外的排序子句,子句的语法跟具体的模式有关。 $cl->SetGroupBy ("UserName", SPH_GROUPBY_ATTR, $groupsort ); $cl->SetGroupDistinct ( $distinct ); /* $cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" ); $cl->SetGroupDistinct ( "vendor" ); 相当于: SELECT id, weight, all-attributes, COUNT(DISTINCT vendor) AS @distinct, COUNT(*) AS @count FROM products GROUP BY category ORDER BY @count DESC */ |
//SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序SPH_SORT_EXTENDED 模式, 按一种类似 SQL 的方式将列组合起来,升序或降序排列。SPH_SORT_EXPR 模式,按某个算术表达式排序。
代码如下 | 复制代码 |
$cl->SetSortMode ( SPH_SORT_EXTENDED, "post_date"); //从第0个开始,取$limit 个, 第三个参数限制了最大偏移量不大于1000 $cl->SetLimits ( 0, $limit, ( $limit>1000 ) ? $limit : 1000 ); |
//设置评分模式: * SPH_RANK_PROXIMITY_BM25, 默认模式,同时使用词组评分和BM25评分,并且将二者结合。* SPH_RANK_BM25, 统计相关度计算模式,仅使用BM25评分计算(与大多数全文检索引擎相同)。这个模式比较快,但是可能使包含多个词的查询的结果质量下降。 * SPH_RANK_NONE, 禁用评分的模式,这是最快的模式。实际上这种模式与布尔搜索相同。所有的匹配项都被赋予权重1。* SPH_RANK_WORDCOUNT, 根据关键词出现次数排序。这个排序器计算每个字段中关键字的出现次数,然后把计数与字段的权重相乘,最后将积求和,作为最终结果。* SPH_RANK_PROXIMITY, 版本0.9.9-rc1新增,将原始的词组相似度作为结果返回。在内部,这个模式被用来模拟SPH_MATCH_ALL的查询。 * SPH_RANK_MATCHANY, 版本0.9.9-rc1新增,返回之前在SPH_MATCH_ANY中计算的位次,在内部这个模式用于模拟SPH_MATCH_ANY的查询。* SPH_RANK_FIELDMASK, 版本0.9.9-rc2新增,返回一个32位掩码,其中第N位对应第N个全文字段,从0开始计数,如果某个字段中出现了满足查询的关键词,则对应的标志位被置1。
代码如下 | 复制代码 |
$cl->SetRankingMode ( "SPH_RANK_PROXIMITY_BM25"); //PHP专用。控制搜索结果集的返回格式(匹配项按数组返回还是按hash返回)$arrayresult 参数应为布尔型。如果$arrayresult为false(默认),匹配项以PHP hash格式返回,文档ID为键,其他信息(权重、属性)为值。如果$arrayresult为true,匹配项以普通数组返回,包括匹配项的全部信息(含文档ID) $cl->SetArrayResult ( true ); |
//连接到searchd服务器,根据服务器的当前设置执行给定的查询,取得并返回结果集。$query是查询字串,$index是包含一个或多个索引名的字符串。一旦发生一般错误,则返回假并设置GetLastError()信息。若成功则返回搜索的结果集。此外, $comment 将被发送到查询日志中搜索部分的前面,这对于调试是非常有用的。目前,注释的长度限制为128个字符以内。$index的默认值是"*",意思是对全部本地索引做查询。索引名中允许的字符包括拉丁字母(a-z),数字(0-9),减号(-)和下划线(_),其他字符均视为分隔符。因此,下面的示例调用都是有效的,而且会搜索相同的两个索引:
代码如下 | 复制代码 |
$res = $cl->Query ( $query, $index ); /* $cl->Query ( "test query", "main delta" ); $cl->Query ( "test query", "main;delta" ); $cl->Query ( "test query", "main, delta" ); */ |