sphinx社区全文搜索平台配置手册.docx
- 文档编号:11609907
- 上传时间:2023-03-28
- 格式:DOCX
- 页数:26
- 大小:181.56KB
sphinx社区全文搜索平台配置手册.docx
《sphinx社区全文搜索平台配置手册.docx》由会员分享,可在线阅读,更多相关《sphinx社区全文搜索平台配置手册.docx(26页珍藏版)》请在冰豆网上搜索。
sphinx社区全文搜索平台配置手册
千万级Discuz!
数据全文检索方案(Sphinx)
前言:
康盛创想的Discuz!
从创立之初即以提高产品效率为突破口,随着编译模板,语法生成内核,数据缓存和自动更新机制等独创或独有技术的应用,和坚固的数据结构及最少化数据库查询设计,使得Discuz!
可以在极为繁忙的服务器环境下快速高效稳定运行。
由于Discuz!
产品依赖MySQL数据库性能,在全文检索方面如果仅仅依靠MySQL的LIKE%关键词%语句无法取得理想的成绩。
本文阐述经过Discuz!
生产环境考验的构建在Sphinx基础上的千万级Discuz!
数据全文检索解决方案。
出自俄罗斯的开源全文搜索引擎软件Sphinx在单一索引达到4千万条记录情况下的查询速度仍为0.x秒甚至0.0x秒级别。
Sphinx创建索引的速度约五分钟处理百万条记录,对于每分钟的增量索引重建只需要几十秒,每日的增量索引合并到主索引也只需一分钟左右。
此构架基础上的Discuz!
高负载站点,已成功解决搜索速度慢、经常锁表、无法分布式搜索等问题。
千万级Discuz!
数据全文检索方案(Sphinx)适用于繁忙的站点并且论坛访问者有大量的搜索需求,本方案主要解决搜索缓慢问题。
本文环境以CentOS5为基准。
初始化一次全部索引,按系统计划任务crontab定时方式,每5分钟重建一次增量索引(增量索引不与主索引合并),每日凌晨3:
30建立一次昨日比较的增量索引(合并到主索引中)。
主索引建立在磁盘目录/data/sphdata,增量索引建立在内存/dev/shm/中避免大量的I/O操作,由于帖子编辑限制,全部索引每两个月重建一次。
Sphinx快速介绍
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*FROMcdb_threadsWHEREsubjectLIKE'%关键词%'LIMIT0,10;类似的SQL语句将无法利用Sphinx搜索,即使服务器端已经部署Sphinx也不会对该查询语句有任何优化作用。
正确使用Sphinx搜索数据的操作方式主要有三种:
1、命令行的search工具:
/usr/local/webserver/sphinx/bin/search–ithreadstest
2、php的api接口查询:
原理是直接用fsockopen连接端口,传递数据取得返回结果。
Sphinx官方已经提供php的api接口,可以includeapi查询(本方案以该查询方法为主),也可以将其源代码编译成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-yinstallgccgcc-c++autoconfpythonpython-devellibiconv
2.创建安装文件夹并下载源代码
mkdir–p/data/software
cd/data/software
wget
wget
3.安装MMseg中文分词
tar-xzfmmseg-3.1.tar.gz
cdmmseg-3.1
./configure--prefix=/usr/local/webserver/mmseg
make
makeinstall
cd..
4.安装CSFT(Sphinx的CoreSeek修改版)
tar-xzfcsft-3.1.tar.gz
cdcsft-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/
make
makeinstall
cd..
5.编译Sphinx过程可能出现的错误
a)无法找到mysql路径
确认–with-mysql=之后的路径正确,是当前mysql所在路径。
如果mysql是通过rpm或者yum方式安装,直接–with-mysql使用默认路径即可。
失败尝试指定–with-mysql-includes=路径–with-mysql-libs=路径
b)无法找到libiconv
libiconv通过yum方式安装的,可以直接识别。
源代码编译安装的,需要建立在/usr/lib和/usr/local/lib下建立相应的软链。
ln–s源文件目标文件。
或者将libiconv的目录加入到ld.so.conf(例如libiconv安装在/usr/local/lib/目录中)
echo/usr/local/lib/>>/etc/ld.so.conf
ldconfig
若仍提示libiconv无法找到,需要修改visrc/Makefile文件,找LIBS=开头的行,
将
LIBS=-lm-lz-lexpat-L/usr/local/lib–lpthread
修改成
LIBS=-lm-lz-lexpat-liconv-L/usr/local/lib-lpthread
c)无法找到libmysqlclient.so.15
将libmysqlclient.so.15建立软链到/usr/local/lib和/usr/lib目录下,或者加入到ld.so.conf
echo/usr/local/webserver/mysql/lib/mysql/>>/etc/ld.so.conf
ldconfig
d)php5.2.11版本的apiBUG
当站点的php版本为5.2.11,并且通过phpapi方式获取Sphinx数据,数据超过1000条的情况下有BUG,无法解析正确的数据包。
遇到此情况必须重新编译php版本,目前已知php5.2.10是与SphinxAPI结合非常稳定的版本。
e)生成索引时容易发生磁盘空间不足写入失败的错误
需要注意配置文件中设置的Sphinx索引数据存放目录,确保有足够的存储空间。
Sphinx的索引文件占用的空间略小于数据库数据文件本身占用的空间。
6.安装为php扩展(可选)
cdcsft-3.1/api/libsphinxclient
CXXCPP="gcc-E"./configure--prefix=/usr/local/webserver/csft
make
makeinstall
cd../../
/usr/local/webserver/php/bin/phpize
./configure--with-sphinx=/usr/local/webserver/csft
make
makeinstall
7.安装SphinxSE存储引擎(可选)
安装SphinxSE需要重新编译MySQL,简要介绍另一种搜索方法。
cp-rfcsft-3.1/mysqlsemysql-5.1.42/storage/sphinx
cdmysql-5.1.42
shBUILD/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=sphinx
make&&makeinstall
cd../
四、Sphinx配置
8.mmseg中文分词词库
f)词典格式
....
河187
x:
187
造假者1
x:
1
台北队1
x:
1
湖边1
......
其中,每条记录分两行。
其中,第一行为词项,其格式为:
[词条]\t[词频率]。
需要注意的是,对于单个字后面跟这个字作单字成词的频率,这个频率需要在大量的预先切分好的语料库中进行统计,用户增加或删除词时,一般不需要修改这个数值;对于非单字词,词频率处必须为1。
第二行为占位项,保持一致即可。
换行符使用\n,字符编码UTF-8
g)词库生成方法
整理好的文本词库(词条不可重复)new.txt,使用mmseg生成new.txt.uni的二进制词库文件。
/usr/local/webserver/mmseg/bin/mmseg–unew.txt
uni.lib文件存放于/usr/local/webserver/csft目录
mvnew.txt.uni/usr/local/webserver/csft/uni.lib
依据社区常见词汇,针对不同行业设计相应的高频词汇,分词将更精确。
uni.lib词库文件发生改变后,sphinx索引需全部重建。
9.创建sphinx数据目录结构
mkdir-p/data/sphdata
mkdir-p/dev/shm/sphminute
10.创建sphinx.conf配置文件
vi/usr/local/webserver/csft/etc/sphinx.conf
#############################################################################
##数据源
#############################################################################
#Threads
sourcethreads
{
type=mysql
#sphinx从mysql中获取数据源
sql_host=localhost
sql_user=root
sql_pass=test
sql_db=discuz
sql_port=3306
#sql_sock=/tmp/mysql.sock
#设置mysql数据库帐号密码
sql_query_pre=SETNAMESgbk
sql_query_pre=SETSESSIONquery_cache_type=OFF
sql_query_pre=REPLACEINTOcdb_sphinxcounter\
SELECT1,MAX(tid)FROMcdb_threads
#mysql预查询,设置连接字符编码等
sql_query_range=SELECTMIN(tid),(SELECTmaxidFROMcdb_sphinxcounterWHEREindexid=1)FROMcdb_threads
sql_range_step=1000
#分次查询数据,不要一次将全部数据取出
sql_query=\
SELECTtid,tidastid,fid,iconid,typeid,sortid,authorid,dateline,displayorder,digest,special,closed,\
subject,\
'threads'AStablename\
FROMcdb_threads\
WHEREtid>=$startANDtid<=$end
#数据内容包含哪些字段,数据范围是在哪些(通过cdb_sphinxcounter增量表确定数据id范围,不用加读表锁),必须是>=和<=
sql_attr_uint=tid
sql_attr_uint=fid
sql_attr_uint=iconid
sql_attr_uint=typeid
sql_attr_uint=sortid
sql_attr_uint=authorid
sql_attr_timestamp=dateline
sql_attr_uint=displayorder
sql_attr_uint=digest
sql_attr_uint=special
sql_attr_uint=closed
sql_attr_uint=tablename
#设置返回的数据(返回数据的字段必须是INT类型,可以在Query操作的时候设置过滤器过滤)
sql_query_info=SELECT*FROM`cdb_threads`WHEREtid=$id
}
#分钟处理,只扫描增量,不与主索引合并
sourcethreads_minute:
threads
{
sql_query_pre=SETNAMESgbk
sql_query_pre=SETSESSIONquery_cache_type=OFF
sql_query_pre=
#sql_query_pre的个数应与主索引的个数一致
sql_query_range=SELECT(SELECTmaxidFROMcdb_sphinxcounterWHEREindexid=1),MAX(tid)FROMcdb_threads
sql_range_step=1000
#限制增量索引只查询主索引中没有的数据(当天新增的数据)
sql_query=\
SELECTtid,tidastid,fid,iconid,typeid,sortid,authorid,dateline,displayorder,digest,special,closed,\
subject,\
'threads_minute'AStablename\
FROMcdb_threads\
WHEREtid>=$startANDtid<=$end
}
#每日处理,扫描每日增量,并且与主索引合并
sourcethreads_daily:
threads
{
sql_query_pre=SETNAMESgbk
sql_query_pre=SETSESSIONquery_cache_type=OFF
sql_query_pre=
sql_query_range=SELECT(SELECTmaxidFROMcdb_sphinxcounterWHEREindexid=1),MAX(tid)FROMcdb_threads
sql_range_step=1000
sql_query=\
SELECTtid,tidastid,fid,iconid,typeid,sortid,authorid,dateline,displayorder,digest,special,closed,\
subject,\
'threads_daily'AStablename\
FROMcdb_threads\
WHEREtid>=$startANDtid<=$end
sql_query_post=\
REPLACEINTOcdb_sphinxcounterSELECT1,MAX(tid)FROMcdb_threads
#获取数据后,改写cdb_sphinxcounter增量索引计数表中的值
}
#threads1为存档的,拆分的历史数据表,如果该站点的Discuz!
没有分表,不需要此配置段
sourcethreads1:
threads
{
sql_query_pre=SETNAMESgbk
sql_query_pre=SETSESSIONquery_cache_type=OFF
sql_query_pre=
#sql_query_pre的个数应与主索引的个数一致
sql_query_range=SELECTMIN(tid),MAX(tid)FROMcdb_threads1
sql_range_step=1000
sql_query=\
SELECTtid,tidastid,fid,iconid,typeid,sortid,authorid,dateline,displayorder,digest,special,closed,\
subject,\
'threads1'AStablename\
WHEREtid>=$startANDtid<=$end
}
#设置数据存放信息
indexthreads
{
source=threads
path=/data/sphdata/threads
docinfo=extern
mlock=0
morphology=none
min_word_len=2
charset_type=zh_cn.gbk
charset_dictpath=/usr/local/webserver/csft/
html_strip=0
}
#每分钟增量数据存放在内存中减少I/O操作
indexthreads_minute:
threads
{
source=threads_minute
path=/dev/shm/sphminute/threads_minute
}
indexthreads_daily:
threads
{
source=threads_daily
path=/data/sphdata/threads_daily
}
#存档分表的数据存放
indexthreads1:
threads
{
source=threads1
path=/data/sphdata/threads1
}
#全文
sourceposts
{
type=mysql
sql_host=localhost
sql_user=root
sql_pass=test
sql_db=discuz
sql_port=3306
sql_query_pre=SETNAMESgbk
sql_query_pre=SETSESSIONquery_cache_type=OFF
sql_query_pre=REPLACEINTOcdb_sphinxcounterSELECT2,MAX(pid)FROMcdb_posts
sql_query_range=SELECTMIN(pid),(SELECTmaxidFROMcdb_sphinxcounterWHEREindexid=2)FROMcdb_posts
sql_range_step=500
sql_query=\
SELECTp.pid,p.pidaspid,p.tid,p.fid,p.first,p.invisible,p.authorid,p.dateline,t.iconid,t.typeid,t.sortid,t.displayorder,t.digest,t.special,t.closed,\
p.subject,p.message,\
'posts'AStablename\
FROMcdb_postsp\
INNERJOINcdb_threadstONp.tid=t.tid\
WHEREp.pid>=$startANDp.pid<=$end
sql_attr_uint=pid
sql_attr_uint=tid
sql_attr_uint=fid
sql_attr_uint=first
sql_attr_uint=invisible
sql_attr_uint=authorid
sql_attr_timestamp=dateline
sql_attr_uint=iconid
sql_attr_uint=typeid
sql_attr_uint=sorti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sphinx 社区 全文 搜索 平台 配置 手册