关闭

关闭

关闭

封号提示

内容

首页 搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构

搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构.pdf

搭建Sphinx+MySQL5.1x+SphinxSE+mmse…

宋茜茜的小窝 2017-05-23 评分 0 浏览量 0 0 0 0 暂无简介 简介 举报

简介:本文档为《搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构pdf》,可适用于IT/计算机领域,主题内容包含SphinxMySQLxSphinxSEmmseg中文分词搜索引擎架构搭建手记什么是SphinxSphinx是一个全文检索引擎一般而言Sphinx是符等。

SphinxMySQLxSphinxSEmmseg中文分词搜索引擎架构搭建手记什么是SphinxSphinx是一个全文检索引擎一般而言Sphinx是一个独立的搜索引擎意图为其他应用提供高速、低空间占用、高结果相关度的全文搜索功能。Sphinx可以非常容易的与SQL数据库和脚本语言集成。当前系统内置MySQL和PostgreSQL数据库数据源的支持也支持从标准输入读取特定格式的XML数据。通过修改源代码用户可以自行增加新的数据源(例如:其他类型的DBMS的原生支持)。Sphinx的特性高速的建立索引(在当代CPU上峰值性能可达到MB秒)高性能的搜索(在–GB的文本数据上平均每次检索响应时间小于秒)可处理海量数据(目前已知可以处理超过GB的文本数据,在单一CPU的系统上可处理M文档)提供了优秀的相关度算法基于短语相似度和统计(BM)的复合Ranking方法支持分布式搜索providesdocumentexceprtsgeneration可作为MySQL的存储引擎提供搜索服务支持布尔、短语、词语相似度等多种检索模式文档支持多个全文检索字段(最大不超过个)文档支持多个额外的属性信息(例如:分组信息时间戳等)停止词查询支持单一字节编码和编码原生的MySQL支持(同时支持MyISAM和InnoDB)原生的PostgreSQL支持安装本文以CentOSmysqlsphinx(coreseektargz)为例介绍SphinxMySQLxSphinxSE存储引擎mmseg中文分词搜索引擎架构搭建过程。安装MySQLSphinxSE进入软件包目录tarzxvfmysqltargztarzxvfsphinxtargzcprsphinxmysqlsemysqlstoragesphinx把sphinx的源代码复制到mysql源码中cdmysqlBUILDautorunshconfigureprefix=usrlocalwebservermysqlenableassemblerwithextracharsets=complexenablethreadsafeclientwithbigtableswithreadlinewithsslwithembeddedserverenablelocalinfilewithplugins=partition,innobase,myisammrg,sphinxmakemakeinstall#usrsbingroupaddmysql#usrsbinuseraddgmysqlmysql#chmodwusrlocalwebservermysql#chownRmysql:mysqlusrlocalwebservermysql、创建MySQL数据库存放目录##mkdirpdatamysqldata#chownRmysql:mysqldatamysql#、以mysql用户帐号的身份建立数据表:##usrlocalwebservermysqlbinmysqlinstalldbbasedir=usrlocalwebservermysqldatadir=datamysqldatauser=mysql#、创建mycnf配置文件:##vidatamysqlmycnf#mycnf输入以下内容:clientdefaultcharacterset=port=socket=tmpmysqlsockmysqlnoautorehashmysqlduser=mysqlport=socket=tmpmysqlsockbasedir=usrlocalwebservermysqldatadir=datamysqldataopenfileslimit=backlog=maxconnections=maxconnecterrors=tablecache=external=locking=FALSEmaxallowedpacket=Msortbuffersize=Mjoinbuffersize=Mthreadcachesize=threadconcurrency=querycachesize=Mquerycachelimit=Mquerycacheminresunit=kdefaultstorageengine=MyISAMdefaulttabletype=MyISAMthreadstack=Ktransactionisolation=READCOMMITTEDtmptablesize=Mmaxheaptablesize=Mlongquerytime=loglongformatlogbin=datamysqlbinlogbinlogcachesize=Mbinlogformat=MIXEDmaxbinlogcachesize=Mmaxbinlogsize=Mexpirelogsdays=keybuffersize=Mreadbuffersize=Mreadrndbuffersize=Mbulkinsertbuffersize=Mmyisamsortbuffersize=Mmyisammaxsortfilesize=Gmyisamrepairthreads=myisamrecoverskipnameresolvemasterconnectretry=slaveskiperrors=,,,,,,serverid=mysqldumpquickmaxallowedpacket=M#开启MYSQL:usrlocalwebservermysqlbinmysqldsafedefaultsfile=datamysqlmycnf>>dev##关闭MYSQL:usrlocalwebservermysqlbinmysqladminurootpStmpmysqlsockshutdown#、通过命令行登录管理MySQL服务器(提示输入密码时直接回车):##usrlocalwebservermysqlbinmysqlurootpStmpmysqlsock#。安装完成启动MySQL后查看sphinx存储引擎是否安装成功在mysql命令行下执行showengines如果出现如下图红色方框内的信息说明SphinxSE已经安装成功!安装Sphinx全文检索服务器Sphinx默认不支持中文索引及检索以前用Coreseek的补丁来解决目前Coreseek不单独提供补丁文件而基于sphinx开发了Coreseek全文检索服务器Coreseek应该是现在用的最多的sphinx中文全文检索它提供了为Sphinx设计的中文分词包LibMMSeg包含mmseg中文分词其实coreseektargz中已经包含了sphinx前面安装SphinxSE时也可以使用这个压缩包里的mysqlse。我们来看一下的安装过程:安装autoconfBzip–dautoconftarbztarxvfautoconftarcdautoconfconfigureprefix=usrmakemakeinstallcd安装Coreseektarzxvfcoreseektargzcdcoreseekcdmmsegbootstrapconfigureprefix=usrlocalmmsegmakemakeinstallcdcsftshbuildconfshconfigureprefix=usrlocalcoreseekwithoutpythonwithoutunixodbcwithmmsegwithmmsegincludes=usrlocalmmsegincludemmsegwithmmseglibs=usrlocalmmseglibwithmysql=usrlocalwebservermysqlhost=armmakemakeinstalllnsusrlocalwebservermysqllibmysqllibmysqlclientsousrlibcdusrlocalcoreseeketc进入配置目录通过命令ls可以看到个文件examplesqlsphinxconfdistsphinxminconfdist其中examplesql是示例sql脚本我们将其导入到数据库中的test数据库中作为测试数据(会创建两张表documents和tags)visphinxconf输入以下内容#定义一个数据库源名字为srcsourcesrc{type=mysqlsqlhost=localhostsqluser=rootsqlpass=sqldb=testsqlport=#optional,defaultissqlsock=tmpmysqlsocksqlquerypre=SETNAMESsqlquery=SELECTid,title,contentFROMsongssqlqueryinfo=SELECT*FROMsongsWHEREid=$id}#定义建立索引项indextest{source=srcpath=usrlocalcoreseekvardatatestcharsettype=zhcncharsetdictpath=usrlocalmmsegetc}#建索引程序的设置indexer{#建索引时所用的内存限制memlimit=M}#提供服务的进程配置searchd{port=log=usrlocalcoreseekvarlogsearchdlogquerylog=usrlocalcoreseekvarlogquerylogreadtimeout=maxchildren=pidfile=usrlocalcoreseekvarlogsearchdpidmaxmatches=seamlessrotate=preopenindexes=unlinkold=}说明:代码段sourcesrc{***}代表数据源里面主要包含了数据库的配置信息src表示数据源名字,可以随便写。代码段indextest{***}代表为哪个数据源创建索引,与source***是成对出现的其中的source参数的值必须是某一个数据源的名字。其他参数可以查看手册这里不再赘述。生成索引usrlocalcoreseekbinindexercusrlocalcoreseeketcsphinxconfall其中参数all表示生成所有索引当然也可以是索引的名字例如:usrlocalcoreseekbinindexercusrlocalcoreseeketcsphinxconftest执行后可以在usrlocalcoreseekvardata目录中看到多出一些文件,是以索引名为文件名的不同的扩展名的文件在不启动sphinx的情况下即可测试命令:usrlocalcoreseekbinsearchcusrlocalcoreseeketcsphinxconfnumber可以看到将内容中含有number数据的数据查询出来。usrlocalcoreseekbinsearchcusrlocalcoreseeketcsphinxconf研究生创业可以看到我们输入的查询文字已经被拆分成了两个词只是因为我们的测试数据中没有中文数据查询结果为空。我们插入几条新数据。INSERTINTO`test``documents`(`id`,`groupid`,`groupid`,`dateadded`,`title`,`content`)VALUES(,'','','::','研究生的故事','研究生自主创业'),(,'','','::','研究','为了创业而研究生命科学')我们再来看以下数据库中的主要数据插入新数据后需要重新生成索引usrlocalcoreseekbinindexercusrlocalcoreseeketcsphinxconftest然后执行查询测试usrlocalcoreseekbinsearchcusrlocalcoreseeketcsphinxconf研究生创业我们搜索的词语是“研究生创业”可以看到词语被拆分成了研究生和创业两个词,虽然有两条记录都包含“创业和”研究生”这几个字但是“研究生命科学”中的“研究生”三个字虽然是紧挨着的但是不是一个词语结果是只匹配一条“研究生自主创业”我们在搜索“研究”这个词语usrlocalcoreseekbinsearchcusrlocalcoreseeketcsphinxconf研究同样匹配一条记录而“研究生的故事”和“研究生自主创业”的词语却没有被查询出来可以看出sphinx与分词技术结合可以匹配出相关度更高的结果。当然我们的目的不仅限与命令行下的测试我们可以通过搜索API调用来执行搜索搜索API支持PHP、Python、Perl、Rudy和Java。如果从PHP脚本检索需要先启动守护进程searchdPHP脚本需要连接到searchd上进行检索:usrlocalcoreseekbinsearchdcusrlocalcoreseeketcsphinxconf在解压后的sphinxapi目录下的sphinxapiphp就是sphinx官方为我们提供的API文件(其实也可以使用PHP的sphinx扩展)只需将其包含进自己的PHP脚本文件就可以了。示例代码:<phpinclude('sphinxapiphp')$cl=newSphinxClient()设置sphinx服务器地址与端口,如果是本机则可以为localhost$cl>SetServer("",)以下设置用于返回数组形式的结果$cl>SetArrayResult(true)$cl>SetMatchMode(SPHMATCHANY)匹配模式$cl>SetFilter('groupid',array())$result=$cl>Query('研究生创业','test')参数关键字索引名if($result===false){echo"Queryfailed:"$cl>GetLastError()"n"}else{if($cl>GetLastWarning()){echo"WARNING:"$cl>GetLastWarning()""}echo'<pre>'printr($result)}>执行后的结果:Array(error=>warning=>status=>fields=>Array(=>title=>content)attrs=>Array(groupid=>dateadded=>)matches=>Array(=>Array(weight=>attrs=>Array(groupid=>dateadded=>)))total=>totalfound=>time=>words=>Array(研究生=>Array(docs=>hits=>)创业=>Array(docs=>hits=>)))在matches中的就是查询结果我们注意到sphinx是将记录中的主键ID值返回而不是返回所有数据上面的例子中的键名就是记录的ID(如果在查询前执行$cl>SetArrayResult(true)则数组结构会有些许差异)。至此搜索服务器已经为我们完成了大部分工作接下来我们通过主键ID值来查询我们想要的数据就可以了。Sphinx存储引擎的使用SphinxSE是一个可以编译进MySQLx版本的MySQL存储引擎它利用了该版本MySQL的插件式体系结构。尽管被称作“存储引擎”SphinxSE自身其实并不存储任何数据。它其实是一个允许MySQL服务器与searchd交互并获取搜索结果的嵌入式客户端。所有的索引和搜索都发生在MySQL之外。SphinxSE的适用于:使将MySQLFTS应用程序移植到Sphinx使没有SphinxAPI的那些语言也可以使用Sphinx当需要在MySQL端对Sphinx结果集做额外处理(例如对原始文档表做JOINMySQL端的额外过滤等等)时提供优化。要通过SphinxSE搜索需要建立特殊的ENGINE=SPHINX的“搜索表”然后使用SELECT语句从中检索把全文查询放在WHERE子句中。创建一张表tCREATETABLEt(idINTEGERUNSIGNEDNOT,weightINTEGERNOT,queryVARCHAR()NOT,groupidINTEGER,INDEX(query))ENGINE=SPHINXCONNECTION="sphinx:localhost:test"搜索表前三列的类型必须是INTEGERINTEGER和VARCHAR这三列分别对应文档ID匹配权值和搜索查询。查询列必须被索引其他列必须无索引。列的名字会被忽略所以可以任意命名参数CONNECTION来指定用这个表搜索时的默认搜索主机、端口号和索引语法格式:CONNECTION="sphinx:HOST:PORTINDEXNAME"。执行SQL语句selectdid,dtitle,dcontentfromtjoindocumentsasdontid=didandtquery='研究生创业'|id|title|content|||研究生的故事|研究生自主创业|rowinset(sec)结果返回了我们想要的数据可见利用SphinxSE可以仅仅在SQL语句上做很小的改动即可很方便的实现全文检索!主索引增量索引前提:数据不会被改变第一步:建表:(用来存索引过的最大的记录id)Createtablea{Idintunsignednotprimarykey,Maxidintunsigned,}第二步:修改配置文件为:见sphinx配置文件doc第三步:先执行binindexer–cetcsphinxconf–test生成所有的索引-〉一个数据源的主查询只有第一次执行第四步:定期执行:binindexer–cetcsphinxconfdeltarotate生成增量的索引文件第五步:合并到主索引中binindexer–mergetestdelta–cetcsphinxconfrotate

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +1积分

资料评分:

/12
1下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料