sphinx 文档,sphinx全文索引
项目只是导入了大量的产品数据,然后发现网站的产品搜索非常卡壳。最初,进行模糊搜索就像是原生sql。数据量20W的时候还可以接受,到了几百万就卡死了,需要优化。
经过考虑,我们打算采用全文检索sphinx数据库中间件(atlas/mycat)的框架对其进行优化。
我的环境:
64位Centos6.5
Lnmp1.3一键式环境包
CentOS6.4 X64安装sphinx和sphinx for php扩展
安装前,请确保已经安装了常用组件,然后从官网下载最新的sphinx。
yum install -y python python-devel
http://sphinxsearch.com/downloads/release/
安装sphinx
塔尔zxvf sphinx-2.2.10-release.tar.gz
CD sphinx-2 . 2 . 10-发布。/configure-prefix=/usr/local/sphinx - with-MySQL
制作制作安装
如果在制作时有一个未定义的参考libiconv错误,请参考http://www.lvtao.net/database/sphinx-make-error.html的解决方案。
Libsphinxclient安装(PHP模块需要)
cd api/libsphinxclient。/configureprefix=/usr/local/sphinx
制作制作安装
PHP安装的Sphinx模块
下载地址:http://pecl.php.net/package/sphinx
wget http://pecl.php.net/get/sphinx-1.3.0.tgz
tar zxf sphinx-1.3.3.tgz
cd sphinx-1.3.3
/usr/local/php/bin/phpize。/configure-with-PHP-config=/usr/local/PHP/bin/PHP-config-with-sphinx=/usr/local/sphinx/
制作制作安装
添加php扩展库
检查php.ini的位置。
php - ini
编辑配置
vi /usr/local/php/etc/php.ini
:$跳转到文件的末尾
extension _ dir=/usr/local/PHP/lib/PHP/extensions/no-debug-non-zts-2013 12 26/
[斯芬克斯]
extension=sphinx.so
Php -m或phpinfo()来查看扩展是否已经加载。
首先我们要在服务器端设置索引,这样php就可以通过端口访问来获取。
复制默认配置文件并重新创建一个配置文件。
CP/usr/local/sphinx/etc/sphinx-min . conf . dist/usr/local/sphinx/etc/sphinx . conf
Sphinx.conf.dist是完整版的默认配置,内容很多。我选择在这里复制迷你版的sphinx-min.conf.dist,只要满足基本的查询需求即可。
下面的indexer和searchd是索引创建和查询命令配置,基本上只要设置好你想要的日志路径就可以了。
重要上部,源(source)和索引(index)
分析我的需求。我的产品搜索主要包括三个表。
表产品,(标识,产品标识)
产品价目表产品价格,
产品参数表产品属性
这三者通过product表的product_id一对多相关。
源src1对应于指数产品
Src2对应于指数价格
源src3对应于索引属性
您可以在源代码中设置自定义返回字段。
如上
sql_field_string=产品标识
sql_field_string=零件号
配置完成后,创建索引。
当使用命令/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx . conf-all-rotate时,如果searchd进程没有监听和更新,将出现no rotate的提示。
如果不想全部生成,可以使用- all,或者从多个源分别生成。
/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx . conf产品
/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx . conf价格
/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx . conf属性
如果没有问题,一般都是。
接下来,searchd将被用作服务器上sphinx的守护进程。
/usr/local/sphinx/bin/searchd-c/usr/local/sphinx/etc/sphinx.conf(之前测试过途中的test.conf,就用sphinx . conf)
通常,如果报告了错误
如果该文件夹不存在,请创建它。
如果端口进程已经在运行,有两种方法可以停止它。
1,/usr/local/sphinx/bin/searchd-c/usr/local/sphinx/etc/sphinx . conf-stop
2.netstat-tnl检查端口9312是否在侦听。
Lsof -i:9312检查9312的端口信息以获取pid。
杀死{pid}
终止进程后,再次执行searchd命令来启动。
==========
Php结束
//index.php
phpinfo();死;$s=新的SphinxClient$s- setServer(127.0.0.1 ,9312);$ s-set MATCH mode(SPH _匹配_短语);
//$ s-set SORT mode(SPH _排序_ATTR_DESC,是_团);//指定模式
$ s-set SORT mode(SPH _排序_扩展,是_团desc );//扩展模式
$s- SetFilterString(status , 1 );//这个字段需要在sql_attr_string中显示,否则找不到。如果设置了sql_attr_uint,则为int,后跟类型。
$ s-setMaxQueryTime(30);
$res1=$s- query(usb , products );$ res2=$ s-query( 53 e 6 DDE 17 a 667 C4 b 2 af 1d 38 ba 0 a 466 c 4 , prices );$ res3=$ s-query( 53 e 6 DDE 17 a 667 C4 b 2 af 1d 38 ba 0 a 466 c 4 , attrs );//$res=$s- query (switch , products );//$res=$s- query(产品);$ err=$ s-GetLastError();//var _ dump(array _ keys($ RES[ matches ]);//echo br 。只需通过获取的ID读取数据库中的值。br echo pre$products=!空($res1[matches])?$ res1[ matches ]: ;$prices=!空($res2[matches])?$ res2[ matches ]: ;$attrs=!空($res3[matches])?$ res3[ matches ]: ;print _ r($ products);print _ r($价格);print _ r($ attrs);如果(!empty($ err)){ print _ r($ err);} $ s-close();
Coreseek官网挂了,下载不了,暂时不做中文了。看,下载一本汉语词典,等会有空再打。
这是打印的查询返回的匹配结果。如果你想查看整个查询结果,你可以查看PHP手册http://php.net/manual/zh/sphinxclient.query.php.
返回数据结构
描述键值“matches”存储文档ID及其相应的哈希表“total ”,该哈希表包含文档权重和属性值。此查询在服务器中检索到的匹配文档的总数(即服务器端结果集的大小,并与相关设置相关)‘total _ found’(在服务器上找到并处理)索引中匹配文档‘words’的总数将查询关键字(关键字已被转换为大写和小写、取词干和其他处理)映射到一个小哈希表,该哈希表包含有关关键字的统计信息(出现了多少个文档“docs”——和出现了多少次“hits”——)。“错误”搜索报告的错误信息“警告”搜索报告的警告信息
默认监控以上配置,端口9312和9306,9312链接php程序,9306是本地数据库的调试端口。如果想在服务器上测试,可以尝试链接。
mysql -h127.0.0.1 -P9306
Products是索引名index,match是规则匹配,
通配符可以在官网手册里。
http://sphinxsearch.com/docs/current.html#conf-dict搜索通配符
SQL _ query _ pre=set names UTF8 #在执行SQL之前,它将被执行以确保它不是字符集问题。
公共函数index(Request $ Request){ $ sphinx=new sphinx search();$ Sphinx-setMatchMode(\ Sphinx \ Sphinx client:SPH _匹配_短语);$ results=$ sphinx-search( % PSM n1 r 1-25 ylc,11* , products )-query();$ error=$ sphinx-get error message();$products=!空($results[matches])?$ results[ matches ]:array();echo preprint _ r($ products);//DD($ results);//DD($ error);} }
如果searchd进程正在运行,您不仅可以终止它的进程,还可以执行- rotate参数进行无缝更新,而无需重新启动服务。
/usr/local/sphinx/bin/indexer-c/usr/local/sphinx/etc/sphinx . conf产品-旋转
================================================================
听说Atlas用的人很多,安装测试待续——
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。