sphinx安装与 api 学习笔记整理

Seven 绯闻SEO 绯闻SEO,一个专注中小企业网站优化的SEO爱好者

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能.

sphinx 安装

Sphinx在mysql上的应用有两种方式.

1.采用API调用,如使用PHP、java等的API函数或方法查询,优点是可不必对mysql重新编译,服务端进程“低耦合”,且程序可灵活、方便的调用,缺点是如已有搜索程序的条件下,需修改部分程序,推荐程序员使用.

2.使用插件方式(sphinxSE)把sphinx编译成一个mysql插件并使用特定的sql语句进行检索,其特点是,在sql端方便组合,且能直接返回数据给客户端,不必二次查询,在程序上仅需要修改对应的sql,但这对使用框架开发的程序很不方便,比如使用了ORM,另外还需要对mysql进行重新编译,且需要mysql-5.1以上版本支持插件存储.

这里的安装主要介绍的是第一种通过api调用的方式,Sphinx的安装如下:

  1. #下载最新稳定版
  2. wgethttp://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz
  3. tarxzvfsphinx-0.9.9.tar.gz
  4. cdsphinx-0.9.9
  5. ./configure--prefix=/usr/local/sphinx/--with-mysql--enable-id64
  6. make
  7. makeinstall

注意:采用这种方式安装不支持中文分词.

三、Sphinx中文分词中文的全文检索和英文等latin系列不一样,后者是根据空格等特殊字符来断词,而中文是根据语义来分词,中文分词主要有2个插件.

1.Coreseek

Coreseek是现在用的最多的sphinx中文全文检索,它提供了为Sphinx设计的中文分词包LibMMSeg,是基于sphinx的基础上开发的.

2.sfc(Sphinx-for-chinese)

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,安装方法如下:

  1. tar-jxvfautoconf-2.64.tar.bz2
  2. cdautoconf-2.64
  3. ./configure
  4. make
  5. makeinstall

2.下载coreseek

新版本的coreseek将词典和sphinx源程序放在了一个包中,因此只需要下载coreseek包就可以了.

wget http://www.wapm.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz

3.安装mmseg(coreseek所使用的词典),代码如下:

  1. tarxzvfcoreseek-3.2.14.tar.gz
  2. cdmmseg-3.2.14
  3. ./bootstrap#输出的warning信息可以忽略,如果出现error则需要解决
  4. ./configure--prefix=/usr/local/mmseg3
  5. make&&makeinstall
  6. cd..

4.安装coreseek(sphinx),代码如下:

  1. cdcsft-3.2.14
  2. shbuildconf.sh#输出的warning信息可以忽略,如果出现error则需要解决
  3. ./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
  4. make&&makeinstall
  5. cd..

5.测试mmseg分词和coreseek搜索.

备注:需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文,我的系统字符集为en_US.UTF-8也是可以的,代码如下:

  1. cdtestpack
  2. catvar/test/test.xml#此时应该正确显示中文
  3. /usr/local/mmseg3/bin/mmseg-d/usr/local/mmseg3/etcvar/test/test.xml
  4. /usr/local/coreseek/bin/indexer-cetc/csft.conf--all
  5. /usr/local/coreseek/bin/search-cetc/csft.conf

网络搜索,此时正确的应该返回:

words:

1. '网络': 1 documents, 1 hits

2. '搜索': 2 documents, 5 hits

6.生成 mmseg词库及配置文件

新版本的已经自动生成.

sphinx api 的完整用法及重要属性,整理一下,以防忘记,代码如下:

  1. $cl=newSphinxClient();
  2. //安装的默认host:localhost,sphinx端口:3312
  3. $cl->SetServer("localhost","3312");
  4. //可选,为每一个全文检索字段设置权重,主要根据你在sql_query中定义的字段的顺序,Sphinx系统以后会调整,可以按字段名称来设定权重.可以参考SetFieldWeights(array(100,1))
  5. $cl->SetWeights(array(100,1));
  6. //查询的模式,总共有以下模式:SPH_MATCH_ALL,匹配所有查询词(and)(默认模式)SPH_MATCH_ANY,匹配查询词中的任意一个(or)SPH_MATCH_PHRASE,将整个查询看作一个词组,要求按顺序完整匹配SPH_MATCH_BOOLEAN,将查询看作一个布尔表达式SPH_MATCH_EXTENDED,将查询看作一个Sphinx内部查询语言的表达式。还有一个特殊的“完整扫描”模式,当如下条件满足时,该模式被自动激活:
  7. //1.查询串是空的(即长度为零)
  8. //2.docinfo存储方式为extern在完整扫描模式中,全部已索引的文档都被看作是匹配的。这类匹配仍然会被过滤、排序或分组,但是并不会做任何真正的全文检索。这种模式可以用来统一全文检索和非全文检索的代码,或者减轻SQL服务器的负担(有些时候Sphinx扫描的速度要优于类似的MySQL查询)
  9. $cl->SetMatchMode("SPH_MATCH_ALL");
  10. //只搜索forum_id=1或3或7如果$cl->SetFilter("forum_id",array(1,3,7),true);表示只搜索forum_id!=1或!=2或!=7
  11. $cl->SetFilter("forum_id",array(1,3,7));
  12. //SPH_GROUPBY_DAY,从时间戳中按YYYYMMDD格式抽取年、月、日
  13. //SPH_GROUPBY_WEEK,从时间戳中按YYYYNNN格式抽取年份和指定周数(自年初计起)的第一天
  14. //SPH_GROUPBY_MONTH,从时间戳中按YYYYMM格式抽取月份
  15. //SPH_GROUPBY_YEAR,从时间戳中按YYYY格式抽取年份//最终的搜索结果中每组包含一个最佳匹配。分组函数值和每组的匹配数目分别以“虚拟”属性@group和@count的形式返回。
  16. //SPH_SORT_RELEVANCE忽略任何附加的参数,永远按相关度评分排序。所有其余的模式都要求额外的排序子句,子句的语法跟具体的模式有关。
  17. $cl->SetGroupBy("UserName",SPH_GROUPBY_ATTR,$groupsort);
  18. $cl->SetGroupDistinct($distinct);
  19. /*phpfensi.com
  20. $cl->SetGroupBy("category",SPH_GROUPBY_ATTR,"@countdesc");
  21. $cl->SetGroupDistinct("vendor");

相当于:

  1. SELECTid,weight,all-attributes,
  2. COUNT(DISTINCTvendor)AS@distinct,
  3. COUNT(*)AS@count
  4. FROMproducts
  5. GROUPBYcategory
  6. ORDERBY@countDESC

SPH_SORT_RELEVANCE 模式, 按相关度降序排列(最好的匹配排在最前面)

SPH_SORT_ATTR_DESC 模式, 按属性降序排列 (属性值越大的越是排在前面)

SPH_SORT_ATTR_ASC 模式, 按属性升序排列(属性值越小的越是排在前面)

SPH_SORT_TIME_SEGMENTS 模式, 先按时间段(最近一小时/天/周/月)降序,再按相关度降序SPH_SORT_EXTENDED 模式, 按一种类似 SQL 的方式将列组合起来,升序或降序排列。SPH_SORT_EXPR 模式,按某个算术表达式排序,代码如下:

  1. $cl->SetSortMode(SPH_SORT_EXTENDED,"post_date");
  2. //从第0个开始,取$limit个,第三个参数限制了最大偏移量不大于1000
  3. $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");
相关广告
  • sphinx安装与 api 学习笔记整理 sphinx安装与 api 学习笔记整理 sphinx安装与 api 学习笔记整理
相关阅读

sphinx安装与 api 学习笔记整理

2019/10/10 17:37:02 | 谷歌SEO算法 | SEO工具