为什么要使用Sphinx假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方法也行)。Sphinx是什么Sphinx由俄罗斯人AndrewAksyonoff开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。Sphinx的特性高速索引(在新款CPU上,近10MB/秒);高速搜索(2-4G的文本量中平均查询速度不到0.1秒);高可用性(单CPU上最大可支持100GB的文本,100M文档);提供良好的相关性排名;支持分布式搜索;提供文档摘要生成;提供从MySQL内部的插件式存储引擎上搜索;支持布尔,短语,和近义词查询;支持每个文档多个全文检索域(默认最大32个);支持每个文档多属性;支持断词;支持单字节编码与UTF-8编码;下载并安装Sphinx打开网址coreseek/news/7/52/找到适合自己的操作系统的版本,比如我是Windows那么我就可以下载CoreseekWin32通用版本,Linux下可以下载源码包,自己编译安装。这里解释下为什么我们下载的程序叫Coreseek,Coreseek是基于Sphinx开发的一款软件,对Sphinx做了一些改动,在中文方面支持得比Sphinx好,所以我们使用之。下载完成后,将程序解压到你想解压的地方,比如我就想解压到E盘根目录,之后修改目录名为Coreseek,大功告成Coreseek安装完成了,安装的目录是在E:\coreseek\。使用Sphinx我要使用Sphinx需要做以下几件事1)、首先得有数据2)、建立Sphinx配置文件3)、生成索引4)、启动Sphinx5)、使用之(调用api或search.exe程序进行查询)第1步:(导入数据)我们建立测试所需要用到得数据库、表以及数据,篇幅有限,这些在附件中都有,下载后导入MySQL即可。第2步:(建立配置文件)接下来我们需要建立一个Sphinx的配置文件E:\coreseek\etc\mysql.conf,将其内容改为下面这些:sourcemysql{type=mysql//数据库类型sql_host=localhost//数据库地址sql_user=root//数据库用户名sql_pass=//数据库密码sql_db=test//数据库名sql_port=3306//端口号sql_query_pre=SETNAMESutf8//设置字符集sql_query=SELECTid,addtime,title,contentFROMpostsql_attr_timestamp=addtime}indexmysql{source=mysqlpath=E:/coreseek/var/data/mysqlcharset_dictpath=E:/coreseek/etc/charset_type=zh_.utf-8}searchd{listen=9312max_matches=1000pid_file=E:/coreseek/var/log/searchd_mysql.pidlog=E:/coreseek/var/log/searchd_mysql.logquery_log=E:/coreseek/var/log/query_mysql.log}先讲下这个配置文件中每项的含义。sourcemysql{}定义源名称为mysql,也可以叫其他的,比如:sourcexxx{}type数据源类型。sql_*数据相关的配置,比如sql_host,sql_pass什么的,这些不解释。sql_query建立索引时的查询命令,在这里尽可能不使用where或groupby,将where与groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高,注意:select的字段必须包括一个唯一主键以及要全文检索的字段,where中要用到的字段也要select出来sql_query_pre在执行sql_query前执行的sql命令,可以有多条。sql_attr以这个开头的配置项,表示属性字段,在where,orderby,groupby中出现的字段要分别定义一个属性,定义不同类型的字段要用不同的属性名,比如上面的sql_attr_timestamp就是时间戳类型。indexmysql{}定义索引名称为mysql,也可以叫其他的,比如:indexxxx{}source关联源,就是sourcexxx定义的。path索引文件存放路径,比如:E:/coreseek/var/data/mysql实际存放在E:/coreseek/var/data/目录,然后创建多个名称为mysql后缀却不同的索引文件charset_dictpath指明分词法读取词典文件的位置,当启用分词法时,为必填项。在使用LibMMSeg作为分词库时,需要确保词典文件uni.lib在指定的目录下charset_type字符集,比如charset_type=zh_.gbksearchd{}sphinx守护进程配置listen监听端口max_matches最大匹配数,也就是查找的数据再多也只返回这里设置的1000条pid_filepid文件路径log全文检索日志query_log查询日志好了,配置文件就这样,配置的参数还有很多,大家可以自己查文档。第3步:(生成索引)开始-运行-输入cmd回车,打开命令行工具e:\coreseek\bin\indexer–confige:\coreseek\etc\mysql.conf–all这一串东西其实就是调用indexer程序来生成所有索引如果只想对某个数据源进行索引,则可以这样:e:\coreseek\bin\indexer–confige:\coreseek\etc\mysql.conf索引名称(索引名称指配置文件中所定义的)–config,–all这些都是indexer程序的参数,想了解更多参数的朋友可以查看文档运行命令后如果你没看到FATAL,ERROR这些东西,那么索引文件就算生成成功了,比如我看到得就是………省略………usingconfigfile‘e:\coreseek\etc\mysql.conf’…indexingindex‘mysql’…collected4docs,0.0MB………省略………第4步:(启动Sphinx)同样命令行下:e:\coreseek\bin\searchd–confige:\coreseek\etc\mysql.conf运行后提示了一大堆东西…省略…usingconfigfile‘e:\coreseek\etc\mysql.conf’…listeningonallinterfaces,port=9312aeptingconnections不用管这些鸟文是啥意思,反正Sphinx是启动好了。现在有一串鸟文的这个命令行是不能关的,因为关了Sphinx也就关了,如果觉得这样不爽,可以将Sphinx安装成系统服务,在后台运行,安装系统服务只需在命令行中输入以下命令:e:\coreseek\bin\searchd–confige:\coreseek\etc\mysql.conf–install安装之后记得启动这个服务,不会启动那我没法,自己google。第5步:(使用Sphinx)在web根目录下建立一个search目录(当然不在根目录也行,同样目录名也可以随取),复制E:\coreseek\api\sphinxapi.php文件到search目录(sphinxapi.php这个是sphinx提供的api),开始php程序的编写。在search目录建立一个文件,名字叫啥都行,我管它叫index.php,其内容如下<?phpinclude‘sphinxapi.php’;//加载SphinxAPI$sc=newSphinxClient();//实例化Api$sc-setServer(‘localhost’,9312);//设置服务端,第一个参数sphinx服务器地址,第二个sphinx监听端口$res=$sc-query(‘sphinx’,‘mysql’);//执行查询,第一个参数查询的关键字,第二个查询的索引名称,mysql索引名称(这个也是在配置文件中定义的),多个索引名称以,分开,也可以用*表示所有索引。print_r($res);打印结果:Array(………省略………[matches]=Array([2]=Array([weight]=2[attrs]=Array([addtime]=1282622004))[4]=Array([weight]=2[attrs]=Array([addtime]=1282622079)))………省略………)Matches中就是查询的结果了,但是仿佛不是我们想要的数据,比如titile,content字段的内容就没有查询出来,根据的说明是Sphinx并没有连接到MySQL去取数据,只是根据它自己的索引内容进行计算,因此如果想用Sphinx提供的API去取得我们想要的数据,还必须以查询的结果为依据,再次查询MySQL从而得到我们想要的数据。查询结果中键值分别表示2唯一主键weight权重attrssql_attr_*中配置至此,搜索引擎算是完成一大半了,剩下的大家可以自行完成。比如:<?php$ids=array_keys($res[&39;matches&39;]);//获取主键$ids=join(‘,’,$ids);$query=mysql_query(“SELECT*FROMpostWHEREidIN({$ids})”);while($row=mysql_fetch_assoc($query)){…..}Sphinx在windows下安装使用前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统。网上的资料大多是在linux环境下的安装使用,当然,作为生产环境很有必要部署在*nix环境下,作为学习测试,还是windows环境比较方便些。本文旨在提供一种便捷的方式让Sphinx在windows下安装配置以支持中文全文检索,配置部分在linux下通用。一、关于SphinxSphinx是一个在GPLv2下发布的一个全文检索引擎,商业授权(例如,嵌入到其他程序中)需要联系作者(Sphinxsearch)以获得商业授权。一般而言,Sphinx是一个独立的搜索引擎,意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和代码语言集成。当前系统内置MySQL和PostgreSQL数据库数据源的支持,也支持从标准输入读取特定格式的XML数据。通过修改源代码,用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。搜索API支持PHP、Python、Perl、Rudy和Java,并且也可以用作MySQL存储引擎。搜索API非常简单,可以在若干个小时之内移植到新的语言上。中文手册可以在这里获得(酷勤网备用下载地址:sphinx_doc_zh_0.9.pdf)。二、Sphinx在windows上的安装1.直接在sphinxsearch/downloads.html找到最新的windows版本,我这里下的是Win32releasebinarieswithMySQLsupport,下载后解压在D:\sphinx目录下;2.在D:\sphinx\下新建一个data目录用来存放索引文件,一个log目录方日志文件,复制D:\sphinx\sphinx.conf.in到D:\sphinx\bin\sphinx.conf(注意修改文件名);3.修改D:\sphinx\bin\sphinx.conf,我这里