sphinx社区全文搜索平台配置手册.docx_第1页
sphinx社区全文搜索平台配置手册.docx_第2页
sphinx社区全文搜索平台配置手册.docx_第3页
sphinx社区全文搜索平台配置手册.docx_第4页
sphinx社区全文搜索平台配置手册.docx_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

千万级Discuz!数据全文检索方案(Sphinx)前言:康盛创想的Discuz!从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得 Discuz! 可以在极为繁忙的服务器环境下快速高效稳定运行。由于Discuz!产品依赖MySQL数据库性能,在全文检索方面如果仅仅依靠MySQL的LIKE %关键词% 语句无法取得理想的成绩。本文阐述经过Discuz!生产环境考验的构建在Sphinx基础上的千万级Discuz!数据全文检索解决方案。出自俄罗斯的开源全文搜索引擎软件Sphinx在单一索引达到4千万条记录情况下的查询速度仍为0.x秒甚至0.0x秒级别。Sphinx创建索引的速度约五分钟处理百万条记录,对于每分钟的增量索引重建只需要几十秒,每日的增量索引合并到主索引也只需一分钟左右。此构架基础上的Discuz!高负载站点,已成功解决搜索速度慢、经常锁表、无法分布式搜索等问题。千万级Discuz!数据全文检索方案(Sphinx)适用于繁忙的站点并且论坛访问者有大量的搜索需求,本方案主要解决搜索缓慢问题。本文环境以CentOS 5为基准。初始化一次全部索引,按系统计划任务crontab定时方式,每5分钟重建一次增量索引(增量索引不与主索引合并),每日凌晨3:30建立一次昨日比较的增量索引(合并到主索引中)。主索引建立在磁盘目录/data/sphdata,增量索引建立在内存/dev/shm/中避免大量的I/O操作,由于帖子编辑限制,全部索引每两个月重建一次。目 录千万级Discuz!数据全文检索方案(Sphinx)1Sphinx快速介绍2一、Sphinx全文检索方案构架图3二、Sphinx中文分词4三、Sphinx安装步骤41.安装、升级所需的程序库42.创建安装文件夹并下载源代码43.安装MMseg中文分词44.安装CSFT(Sphinx的CoreSeek修改版)55.编译Sphinx过程可能出现的错误5a)无法找到mysql路径5b)无法找到libiconv5c)无法找到libmysqlclient.so.155d)php 5.2.11版本的api BUG5e)生成索引时容易发生磁盘空间不足写入失败的错误56.安装为php扩展(可选)67.安装SphinxSE存储引擎(可选)6四、Sphinx配置61.mmseg中文分词词库6a)词典格式6b)词库生成方法72.创建sphinx数据目录结构73.创建sphinx.conf配置文件74.mmseg.ini分词配置文件145.建立Sphinx增量索引数据表146.书写常用的sphinx控制命令到sh文件147.创建相应的文件结构,初始化Sphinx的全部索引178.启动sphinx179.设置计划任务项1710.设置开机启动项17五、通过命令行测试搜索17六、通过php api调用Sphinx搜索18七、通过MySQL的SphinxSE存储引擎调用Sphinx搜索(可选)19八、Sphinx数据占用量统计19Sphinx快速介绍Sphinx是独立的搜索服务端,不依赖MySQL,当Sphinx和MySQL结合部署时,Sphinx的数据来源为MySQL。服务器安装Sphinx,由sphinx.conf配置文件指定Sphinx的数据源,如何读取MySQL的数据内容,设置Sphinx对MySQL数据库的哪个表哪些字段建立索引,索引的返回数据必须是数值型。例如一个配置段设置Sphinx对cdb_threads表的subject和author字段建立索引,搜索结果可以返回tid和uid。另一个配置段设置Sphinx对cdb_posts表的subject和message字段索引,搜索结果返回tid和pid。Sphinx建立的索引只是查询MySQL数据库获取数据内容,将索引存放在Sphinx的数据文件和内存中,一般不对MySQL数据库进行修改操作。因为Sphinx独立运行,使用SELECT * FROM cdb_threads WHERE subject LIKE %关键词% LIMIT 0, 10; 类似的SQL语句将无法利用Sphinx搜索,即使服务器端已经部署Sphinx也不会对该查询语句有任何优化作用。正确使用Sphinx搜索数据的操作方式主要有三种:1、命令行的search工具:/usr/local/webserver/sphinx/bin/search i threads test2、php的api接口查询:原理是直接用fsockopen连接端口,传递数据取得返回结果。 Sphinx官方已经提供php的api接口,可以include api查询(本方案以该查询方法为主),也可以将其源代码编译成php扩展而无需include。3、在mysql中将Sphinx安装为SphinxSE存储引擎,通过SphinxSE方式调用Sphinx。因Sphinx搜索结果只返回INT类型数据,部署Sphinx搜索的核心是由搜索入口(search.php)提交的关键词到Sphinx中搜索,Sphinx返回对应的tid、pid等信息,再依据tid、pid到cdb_threads或者cdb_posts中搜索,得到结果集展示在页面上。Sphinx的搜索速度非常快,而tid/pid都是主键查询,总体来说虽然用了多次查询,但是速度仍然非常快。一、 Sphinx全文检索方案构架图二、 Sphinx中文分词打过Sphinx官方补丁的Sphinx可以支持utf8、gbk等编码的汉字,按单个汉字切分,汉语搜索中应以词为依据,独立存在的单个汉字搜索几乎没有意义。本文介绍的构架方案以CoreSeek的CSFT修改版为主,由libmmseg对搜索词予以分词切分,Sphinx按切分词建立相应索引从而建立以词和短语为基准的搜索。三、 Sphinx安装步骤1. 安装、升级所需的程序库yum -y install gcc gcc-c+ autoconf python python-devel libiconv2. 创建安装文件夹并下载源代码mkdir p /data/softwarecd /data/softwarewget /uploads/csft/3.1/Source/mmseg-3.1.tar.gzwget /uploads/csft/3.1/Source/csft-3.1.tar.gz3. 安装MMseg中文分词tar -xzf mmseg-3.1.tar.gzcd mmseg-3.1./configure -prefix=/usr/local/webserver/mmsegmakemake installcd .4. 安装CSFT(Sphinx的CoreSeek修改版)tar -xzf csft-3.1.tar.gzcd csft-3.1./configure -prefix=/usr/local/webserver/csft -with-mmseg=/usr/local/webserver/mmseg/bin/mmseg -with-mmseg-includes=/usr/local/webserver/mmseg/include/mmseg/ -with-mmseg-libs=/usr/local/webserver/mmseg/lib/ -with-mysql=/usr/local/webserver/mysql/makemake installcd .5. 编译Sphinx过程可能出现的错误a) 无法找到mysql路径确认 with-mysql=之后的路径正确,是当前mysql所在路径。如果mysql是通过rpm或者yum方式安装,直接 with-mysql 使用默认路径即可。失败尝试指定 with-mysql-includes=路径 with-mysql-libs=路径b) 无法找到libiconvlibiconv通过yum方式安装的,可以直接识别。源代码编译安装的,需要建立在/usr/lib和/usr/local/lib下建立相应的软链。ln s 源文件 目标文件。或者将libiconv的目录加入到ld.so.conf(例如libiconv安装在/usr/local/lib/目录中)echo /usr/local/lib/ /etc/ld.so.confldconfig若仍提示libiconv无法找到,需要修改vi src/Makefile 文件,找 LIBS = 开头的行,将LIBS = -lm -lz -lexpat -L/usr/local/lib lpthread修改成LIBS = -lm -lz -lexpat -liconv -L/usr/local/lib -lpthreadc) 无法找到libmysqlclient.so.15将libmysqlclient.so.15建立软链到/usr/local/lib和/usr/lib目录下,或者加入到ld.so.confecho /usr/local/webserver/mysql/lib/mysql/ /etc/ld.so.confldconfigd) php 5.2.11版本的api BUG当站点的php版本为5.2.11,并且通过php api方式获取Sphinx数据,数据超过1000条的情况下有BUG,无法解析正确的数据包。遇到此情况必须重新编译php版本,目前已知php 5.2.10是与Sphinx API结合非常稳定的版本。e) 生成索引时容易发生磁盘空间不足写入失败的错误需要注意配置文件中设置的Sphinx索引数据存放目录,确保有足够的存储空间。Sphinx的索引文件占用的空间略小于数据库数据文件本身占用的空间。6. 安装为php扩展(可选)cd csft-3.1/api/libsphinxclientCXXCPP=gcc -E ./configure -prefix=/usr/local/webserver/csftmakemake installcd ././usr/local/webserver/php/bin/phpize./configure -with-sphinx=/usr/local/webserver/csftmakemake install7. 安装SphinxSE存储引擎(可选)安装SphinxSE需要重新编译MySQL,简要介绍另一种搜索方法。cp -rf csft-3.1/mysqlse mysql-5.1.42/storage/sphinxcd mysql-5.1.42sh BUILD/autorun.sh./configure -prefix=/usr/local/webserver/mysql/ -enable-assembler -with-extra-charsets=complex -enable-thread-safe-client -with-big-tables -with-readline -with-ssl -with-embedded-server -enable-local-infile -with-plugins=sphinxmake & make installcd ./四、 Sphinx配置1. mmseg中文分词词库a) 词典格式.河 187x:187造假者 1x:1台北队 1x:1湖边 1.其中,每条记录分两行。其中,第一行为词项,其格式为:词条t词频率。需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率需要在大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。第二行为占位项,保持一致即可。换行符使用n,字符编码UTF-8b) 词库生成方法整理好的文本词库(词条不可重复)new.txt,使用mmseg生成new.txt.uni的二进制词库文件。/usr/local/webserver/mmseg/bin/mmseg u new.txtuni.lib文件存放于/usr/local/webserver/csft目录mv new.txt.uni /usr/local/webserver/csft/uni.lib依据社区常见词汇,针对不同行业设计相应的高频词汇,分词将更精确。uni.lib词库文件发生改变后,sphinx索引需全部重建。2. 创建sphinx数据目录结构mkdir -p /data/sphdatamkdir -p /dev/shm/sphminute3. 创建sphinx.conf配置文件vi /usr/local/webserver/csft/etc/sphinx.conf# 数据源# Threadssource threadstype= mysql#sphinx从mysql中获取数据源sql_host= localhostsql_user= rootsql_pass= testsql_db= discuzsql_port= 3306#sql_sock=/tmp/mysql.sock#设置mysql数据库帐号密码sql_query_pre= SET NAMES gbksql_query_pre= SET SESSION query_cache_type=OFFsql_query_pre= REPLACE INTO cdb_sphinxcounter SELECT 1, MAX(tid) FROM cdb_threads#mysql预查询,设置连接字符编码等sql_query_range= SELECT MIN(tid), (SELECT maxid FROM cdb_sphinxcounter WHERE indexid = 1) FROM cdb_threadssql_range_step = 1000#分次查询数据,不要一次将全部数据取出sql_query= SELECT tid, tid as tid, fid, iconid, typeid, sortid, authorid, dateline, displayorder, digest, special, closed, subject, threads AS tablename FROM cdb_threadsWHERE tid=$start AND tid= 和 =$start AND tid=$start AND tid=$start AND tid=$start AND p.pid=$start AND p.pid=$start AND p.pid=$start AND p.pid=$endindex postssource= postspath= /data/sphdata/postsdocinfo= externmlock= 0morphology= nonemin_word_len= 2charset_type= zh_cn.gbkcharset_dictpath= /usr/local/webserver/csft/html_strip= 0index posts_minute: postssource= posts_minutepath= /dev/shm/sphminute/posts_minuteindex posts_daily: postssource= posts_dailypath= /data/sphdata/posts_dailyindex posts1: postssource= posts1path= /data/sphdata/posts1# indexer settings#indexermem_limit= 128Mmax_iosize= 524288#此处的mem_limit和max_iosize需要配合设置,不能太大影响服务器运行,也不能太小导致sphinx生成索引缓慢。如果遇到生成索引提前退出而没有任何报错的情况,需适当调小mem_limit设置# searchd settings#searchdlisten=3312#listen= /tmp/searchd.sock#如果监听为sock方式,注意设置每次启动时设置sock文件的权限为777log= /usr/local/webserver/csft/var/log/searchd.logquery_log= /usr/local/webserver/csft/var/log/query.logread_timeout= 10client_timeout= 10max_children= 30pid_file= /var/run/searchd.pidmax_matches= 10000seamless_rotate= 1preopen_indexes= 0unlink_old= 1mva_updates_pool= 1Mmax_packet_size= 16Mmax_filters= 256max_filter_values= 40964. mmseg.ini分词配置文件rm f /usr/local/webserver/csft/mmseg.inivi /usr/local/webserver/csft/mmseg.inimmsegmerge_number_and_ascii=1;number_and_ascii_joint=-.;compress_space=0;seperate_number_ascii=0;5. 建立Sphinx增量索引数据表CREATE TABLE IF NOT EXISTS cdb_sphinxcounter ( indexid tinyint(1) NOT NULL, maxid int(10) NOT NULL, PRIMARY KEY (indexid) ENGINE=MyISAM DEFAULT CHARSET=gbk;该表为普通表,区别于SphinxSE存储引擎专用表,该表的数据仅仅是配合Sphinx的增量索引而计数的表,indexid表示索引id,值为1表示threads,值为2表示posts,对应的maxid分别记录了上次sphinx增量索引合并时取得的最大id数。6. 书写常用的sphinx控制命令到sh文件vi /usr/local/webserver/csft/sph.sh增加以下内容#! /bin/sh#本shell脚本是将常用的sphinx命令写入到shell中,减少代码量,注意配置部分#config start#sphinx_path=/usr/local/webserver/csft/sphinx_conf=/usr/local/webserver/csft/etc/sphinx.confminute_data_path=/dev/shm/sphminute/update_indexs=(threads posts)rebuild_indexs=(threads posts threads1 posts1 threads2 posts2)#config end#si=0sj=$#update_indexssk=$#rebuild_indexssph_start () $sphinx_pathbin/searchd -config $sphinx_conf#chmod 777 /tmp/searchd.sock#如果监听为sock方式,注意启动命令设置sock文件权限sph_stop () $sphinx_pathbin/searchd -config $sphinx_conf -stopsleep 3sph_createallindex () $sphinx_pathbin/indexer -config $sphinx_conf -allsph_rebuild () si=0while $si -lt $sk do$sphinx_pathbin/indexer -config $sphinx_conf $rebuild_indexs$si -rotatesleep 10let si=si+1donesph_minute_create () mkdir -p $minute_data_pathsi=0while $si -lt $sj do$sphinx_pathbin/indexer -config $sphinx_conf $update_indexs$si_minutesleep 10let si=si+1donesph_minute () si=0while $si -lt $sj do$sphinx_pathbin/indexer -config $sphinx_conf $update_indexs$si_minute -rotatesleep 10let si=si+1donesph_daily () si=0while $si -lt $sj do$sphinx_pathbin/indexer -config $sphinx_conf $update_indexs$si_daily -rotate & $sphinx_pathbin/indexer -config $sphinx_conf -merge $update_indexs$si $update_indexs$si_daily -rotatesleep 10let si=si+1donecase $1 instart)sph_start;stop)sph_stop;restart)sph_stopsph_start;minute)sph_minute;daily)sph_daily;create)sph_stopsph_createallindexsph_start;minute_create)sph_minute_createsph_start;rebuild)sph_rebuild;*)echo Usage: $0 start|stop|restart|minute|daily|create|minute_create|rebuildexit 1;esac编辑完后,设置可执行权限chmod +x /usr/local/webserver/csft/sph.shshell使用举例:/usr/local/webserver/csft/sph.sh start #启动sphinx的searchd守护进程/usr/local/webserver/csft/sph.sh stop #停止sphinx的searchd守护进程7. 创建相应的文件结构,初始化Sphinx的全部索引mkdir p /data/sphdata/usr/local/webserver/csft/sph.sh creat此过程耗时比较长,可以配合screen进入无人值守模式防止中断,适当调整indexer配置段中的内存和I/O占用量,避开高峰时期建立索引,以免出现服务器无法响应问题。8. 启动sphinx/usr/local/webserver/csft/sph.sh start9. 设置计划任务项crontab e增加以下内容#sphinx增量索引,每5分钟重建一次增量索引,资源消耗少(4、5点之间是每15分钟重建一次增量索引)*/5 0-2 * * * /usr/local/webserver/csft/sph.sh minute*/15 4,5 * * * /usr/local/webserver/csft/sph.sh minute*/5 6-23 * * * /usr/local/webserver/csft/sph.sh minute#sphinx每天03:30将增量索引与主索引合并,合并耗时约10分钟30 3 * * * /usr/local/webserver/csft/sph.sh daily#sphinx适当的时机需要重新建立全部索引,耗时约1小时,例如每两个月# /usr/local/webserver/csft/sph.sh rebuild10. 设置开机启动项vi /etc/rc.d/rc.local增加以下内容#/dev/shm是内存信息,重启将会导致文件结构丢失,所以开机初始化一次增量数据并启动sphinx/usr/local/webserver/csft/sph.sh minute_creat五、 通过命令行测试搜索/usr/local/webserver/csft/bin/search -config /usr/local/webserver/csft/etc/sphinx.conf -i threads 康盛创想-i 表示指定使用哪个索引搜索, -config 指定使用配置文件,本利中使用threads帖子标题索引搜索。最末尾的搜索关键词符合sphinx Query语法规则。屏幕回显以下信息rootwww # /usr/local/webserver/csft/bin/search -config /usr/local/webserver /csft/etc/sphinx.conf -i threa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论