特性(最新版sphinx性能某些方面更高于下面描述)
1.高速的建立索引(在当代CPU上,峰值性能可达到10 MB/秒); 2.高性能的搜索(在2 – 4GB 的文本数据上,平均每次检索响应时间小于0.1秒); 3.可处理海量数据(目前已知可以处理超过100 GB的文本数据, 在单一CPU的系统上可 处理100 M 文档); 4.提供了优秀的相关度算法,基于短语相似度和统计(BM25)的复合Ranking方法; 5.支持分布式搜索; 6.可作为MySQL的存储引擎提供搜索服务; 7.支持布尔、短语、词语相似度等多种检索模式; 8.文档支持多个全文检索字段(最大不超过32个); 9.文档支持多个额外的属性信息(例如:分组信息,时间戳等); 10.支持单一字节编码和UTF-8编码; 11.原生的MySQL支持(同时支持MyISAM 和InnoDB ); 12.原生的PostgreSQL 支持.
反正就是很牛逼就是了。
3.sphinx的安装与运行(此部分转载的)
1.需要安装的软件 coreseek的mmseg包 mysql安装包 sphinx-0.9.8版 sphinx中文分词补丁1 sphinx中文分词补丁2
2.安装libmmseg
tar -zxvf mmseg-0.7.3.tar.gz cd mmseg-0.7.3 ./configure --PRefix=/usr/local/mmseg make make install 1234512345有问题尝试执行下面命令
echo '/usr/local/mmseg/lib' >> /etc/ld.so.conf ldconfig -v ln -s /usr/local/mmseg/bin/mmseg /bin/mmseg1231233.重新编译mysql 安装sphinx之前先装两个补丁。
tar -zxvf sphinx-0.9.8-rc2.tar.gz cd sphinx-0.9.8 patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch patch -p1 < ../fix-crash-in-excerpts.patch123412344.安装sphinx
cd /root/lemp/sphinx-0.9.8-rc2 ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/opt/mysql/include/mysql --with-mysql-libs=/opt/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg make1234512345tokenizer_zhcn.cpp:1:30: SegmenterManager.h: 没有那个文件或目录 tokenizer_zhcn.cpp:2:23: Segmenter.h: 没有那个文件或目录1212make clean ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/usr/local/mysql/include/mysql --with-mysql-libs=/opt/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include/mmseg --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg/root/sphinx/sphinx-0.9.8-rc2/src/tokenizer_zhcn.cpp:34: undefined reference to `libiconv_close' collect2: ld returned 1 exit status123456123456官网解决办法:In the meantime I've change the configuration file and set#define USE_LIBICONV 0 in line 8179.修改configure 文件把 #define USE_LIBICONV 0 最后的数值由1改为0重新编译。1234512345make clean ./configure --prefix=/usr/local/sphinx --with-mysql=/opt/mysql / --with-mysql-includes=/usr/local/mysql/include/mysql --with-mysql-libs=/usr/local/mysql/lib/mysql / --with-mmseg-includes=/usr/local/mmseg/include/mmseg --with-mmseg-libs=/usr/local/mmseg/lib --with-mmseg
12341234vi configure输入/define USE_LIBICONV 找到目标行按i键后将1改成0,按esc,输入:wq保存退出
123123make make installcd /usr/local/sphinx/etc cp sphinx.conf.dist sphinx.conf
123412345.配置sphinx
vim /usr/local/sphinx/etc/sphinx.conftype = mysql # some straightforward parameters for SQL source types sql_host = localhost sql_user = root sql_pass = sql_db = test sql_port = 3306 # optional, default is 3306address = 127.0.0.1 #安全点可以只监听本机
123456789101112345678910116.索引建立 装好sphinx后在sphinx的目录中有三个目录 分别为bin etc var bin中 存有sphinx用到的一些执行文件 包括 indexer 索引建立 search 查询工具 searchd 查询服务器。备注:最新版已经没有search 查询工具了
usr/local/sphinx/bin/indexer --config /usr/local/sphinx/etc/sphinx.conf test1 建立索引期间可能由于不同版本的数据库导致indexer找不到共享库libmysqlclient.so.16需要把/opt/mysql/lib/mysql/libmysqlclient.so.16.0.0 这个文件复制到/usr/lib下 或者作软连接即可
123412347.查询服务器 /usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf 为开启
/usr/local/sphinx/bin/searchd –config /usr/local/sphinx/etc/sphinx.conf –stop 为关闭
sphinx的查询 可以大致分为三种
7.1 数据库引擎中的查询7.2 通过search工具查询(最新版已不提供这个工具) /usr/local/sphinx/bin/search --config /usr/local/sphinx/etc/sphinx.conf test7.3 通过php的接口查询 详见sphinxapi.php8.创建sphinx启动脚本与配置
#!/bin/sh # sphinx: Startup script for Sphinx search # # chkconfig: 345 86 14 # description: This is a daemon for high performance full text / # search of MySQL and PostgreSQL databases. / # See http://www.sphinxsearch.com/ for more info. # # processname: searchd # pidfile: $sphinxlocation/var/log/searchd.pid # Source function library. . /etc/rc.d/init.d/functions processname=searchd servicename=sphinx username=sphinx sphinxlocation=/usr/local/sphinx pidfile=$sphinxlocation/var/log/searchd.pid searchd=$sphinxlocation/bin/searchd RETVAL=0 PATH=$PATH:$sphinxlocation/bin start() { echo -n $"Starting Sphinx daemon: " daemon --user=$username --check $servicename $processname RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$servicename } stop() { echo -n $"Stopping Sphinx daemon: " $searchd --stop #killproc -p $pidfile $servicename -TERM RETVAL=$? echo if [ $RETVAL -eq 0 ]; then rm -f /var/lock/subsys/$servicename rm -f $pidfile fi } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status $processname RETVAL=$? ;; restart) stop sleep 3 start ;; condrestart) if [ -f /var/lock/subsys/$servicename ]; then stop sleep 3 start fi ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart}" ;; esac exit $RETVAL
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778chmod 755 /etc/init.d/sphinx chkconfig --add sphinx chkconfig --level 345 sphinx on chkconfig --list|grep sphinx #检查下service sphinx start #运行 service sphinx stop #停止,官方的脚本在我的as4上有点问题,所以粗鲁的改了下 service sphinx restart #重启 service sphinx status #查看是否运行#检查下已用sphinx用户运行ps aux |grep searchd sphinx 24612 0.0 0.3 11376 6256 pts/1 S 14:07 0:00 searchd
1234567891011121234567891011124.sphinx在亿级项目中的使用场景
不管是网站还是app很多产品的设计思路和产品功能多多少少都有相似之处,那么这边主要讲以下几个场景
描述、话题的搜索
主要的实现思路是全量索引+增量索引方式,可设定时任务定点跑索引
用户昵称的搜索
主要是实现思路是实时索引+分布式索引的方式,用户由于过多,故使用实时索引的方法进行增加,旧数据通过跑脚本重新读取后再写入。
搜索框联想词的提示
主要实现思路是分布式索引的方式,自动联想其他人曾经输入过的词语。
tip: morphology = stem_en会启用英文单词的提取。搜索英文时候就不会一个一个字母搜了,会提高sphinx搜索英文单词的时候的效率。