Sphinx 全文搜索引擎.docx
《Sphinx 全文搜索引擎.docx》由会员分享,可在线阅读,更多相关《Sphinx 全文搜索引擎.docx(10页珍藏版)》请在冰豆网上搜索。
Sphinx全文搜索引擎
Sphinx全文搜索引擎
1:
索引与全文索引的概念
数据库中,表中的行特别多,如何快速的查询某一行,或者某一个文章中的单词,
索引--->查询速度快
全文索引-->针对文章内容中的单词各做索引
2:
mysql支不支持全文索引?
答:
支持,但是
A:
innoDB引擎在5.5,及之前的版本不支持(5.7实测可以在innodb上建fulltext),只能在myisam引擎上用fulltext
B:
mysql的全文索引功能不够强大
C:
无法对中文进行合理的全文索引-----mysql.无法进行中文分词.
注意:
全文索引的停止词
停止词是指出现频率极高的单词,不予索引.
如果某单词出现频率50%以上,列为停止词
或者是经过统计的常用词,也列为停止词---如is,are,she,he,this等等
就像中文中:
“的”,”是”,”呵呵”
总结:
我们要对中文做全文搜索引擎,需要解决2个问题
1:
性能提高,用第3方的全文搜索引擎工具,如sphinx,solr等
2:
中文分词!
(如mmseg)
编译安装sphinx+mmseg==coreseek
官网:
0:
安装工具包
yuminstallmakegccgcc-c++libtoolautoconfautomakeimakelibxml2-develexpat-devel
1:
下载解压源码,ls查看
csft-4.1mmseg-3.2.14README.txttestpack
其中--
csft-4.1是修改适应了中文环境后的sphinx
Mmseg是中文分词插件
Testpack是测试用的软件包
2:
先安装mmseg
2.1:
cdmmseg
2.2:
执行bootstrap脚本
2.3:
./configure--prefix=/usr/local/mmseg
2.4:
make&&makeinstall
3:
再安装sphinx(coreseek)
3.1:
到其目录下执行buildconf.sh
3.2:
./configure--prefix=/usr/local/sphinx
--with-mysql=/usr/local/mysql
--with-mmseg
--with-mmseg-includes=/usr/local/mmseg/include/mmseg/--with-mmseg-libs=/usr/local/mmseg/lib/
3.3:
makeinstall
Sphinx的使用
分三个部分:
1:
数据源---要让sphinx知道,查哪些数据,即针对哪些数据做索引(可以定义多个源)
2:
索引配置--针对哪个源做索引,索引文件放在哪个目录?
?
等等
3:
搜索服务器----sphinx可以在某个端口(默认9312),以其自身的协议,与外部程序做交互.
具体的步骤:
1:
数据源典型配置
sourcetest{
type=mysql
sql_host=localhost
sql_user=root
sql_pass=
sql_db=test
sql_query_pre=setnamesutf8
sql_query_pre=setsessionquery_cache_type=off
sql_query=selectid,catid,pubtime,title,contentfromnews
sql_attr_uint=id
sql_attr_uint=catid
sql_attr_timestamp=pubtime
sql_query_info=select*fromnewswhereid=$id
}
2:
索引典型配置
indextest{
type=plain
source=test
path=/usr/local/sphinx/var/data/test#生成索引放在哪
docinfo=extern
charset_dictpath=/usr/local/mmseg/etc/
charset_type=zh_cn.utf-8
}
2.1:
生成索引文件
/path/sphinx/bin/indexer-c./etc/sphinx.test.conftest(test是索引名)
2.2:
查询测试
A:
在命令下,用path/bin/search-c./path/conf关键词
B:
开启搜索服务器,利用客户端连接搜索服务器来查询,见下
3:
配置搜索服务器接口,启动搜索服务器
searchd{
listen=localhost:
9312
pid_file=/usr/local/sphinx/var/log/searchd.pid
log=/usr/local/sphinx/var/log/test.log
query_log=/usr/local/sphinx/var/log/test.query.log
client_timeout=5
max_children=5
max_matches=1000
seamless_rotate=1
}
3.2:
使用客户端连接搜索服务器
1)系统testpack包里带的sphinxapi.php
2)编译php的sphinx扩展
Sphinx扩展的编译
1:
官方搜索下载sphinx扩展的压缩包并解压(假设解析在/usr/local/src/sphinx)
2:
/path/php/bin/phpize执行
3:
configure--with-php-config=/xxx/path/php/bin/php-config
出错:
error:
Cannotfindlibsphinxclientheaders
错误原因:
没有预告编译libsphinxclient
4:
解决3中的错误
cd/usr/local/src/sphinx/api/libsphixclient/目录下
#shbuildconf.sh
#./configure
#make&&makeinstall
5:
编译php的sphinx.so扩展
#cd/path/to/sphinx1.3.0/
#./configure--with-php-config=/usr/local/php/bin/php-config--with-sphinx
#make&&makeinstall
6:
编辑php.ini,把sphinx.so扩展引入
并重启apache,如果是php-fpm方式运行,则重启php-fpm进程
Sphinx的查询语法:
查询分3部分
1:
查询
2:
过滤
3:
排序
1.1:
查询的模式
查询的模式直接影响查询结果,
SPH_MATCH_ALL,匹配所有查询词(默认模式);
SPH_MATCH_ANY,匹配查询词中的任意一个;
SPH_MATCH_PHRASE,将整个查询看作一个词组,要求按顺序完整匹配;
SPH_MATCH_BOOLEAN,将查询看作一个布尔表达式
SPH_MATCH_ALL
->Query(‘西瓜南瓜’)//文档中有西瓜并且有南瓜才被选中
SPH_MATCH_ANY//
->Query(‘西瓜南瓜’)//文档中有西瓜或有南瓜被选中
SPH_MATCH_PHRASE//严格理解为两词连续
如内容”西瓜南瓜东瓜”
->Query(‘西瓜南瓜’),可以命中
->Query(‘西瓜东瓜’),不能命中,因为西瓜东瓜两词不连续
如果你觉得切换模式麻烦,可用BOOLEAN模式
SPH_MATCH_BOOLAN//这个模式,能达到上3个模式的效果,需要在查询词之间做表达式
如
words1&words2则等同SPH_MATCH_ALL
Words1|words2则,等同SPH_MATCH_ANY
Words1<1.2:
按字段查询
如:
要求只查content字段中的”西瓜”关键词
“西瓜”====>”@content西瓜”
注意:
按字段查询需要把查询模式设置成”SPH_MATCH_EXTNEDED”
2按属性过滤
SetIDRange($min,$max);//按id的范围过滤
SetFilter($attr,$values=array(),$exclue=false);//
SetFilterRange($attribute,$min,$max,$exclude=false)
SetFilterFloatRange(设置浮点数范围)
SetLimits($offset,$limits)//设置偏移量及取出条目
例:
->SetIDRange(2,3);
->SetLimits(2,2);取第3-4条
->SetFilter(‘catid’,array(3,4),false);以catidin(3,4)为条件进行过滤
->SetFilter(‘catid’,array(3,4),true);以catidnotin(3,4)为条件,进行过滤
注意:
如果setLimits中碰到”per-querymax_matches=0outofbounds(per-servermax_matches=1000)”错误,可以通过给setLimits指定第3个参数为大于0的整数,来解决.
3:
按属性或权重排序
排序模式:
SPH_SORT_RELEVANCE模式,按相关度降序排列(最好的匹配排在最前面)
SPH_SORT_ATTR_DESC模式,按属性降序排列(属性值越大的越是排在前面)
SPH_SORT_ATTR_ASC模式,按属性升序排列(属性值越小的越是排在前面)
SPH_SORT_TIME_SEGMENTS模式,先按时间段(最近一小时/天/周/月)降序,再按相关度降序
SPH_SORT_EXTENDED模式,按一种类似SQL的方式将列组合起来,升序或降序排列。
SPH_SORT_EXPR模式,按某个算术表达式排序。
排序实例
$sphinxclient->SetSortMode(SPH_SORT_ATTR_DESC,'group_id');//按组id倒序排列
索引的合并
当已有的数据非常大,比如100万条商品信息,
每天新增的较少,比如1000个商品
这时,每增加1个商品,就全新生成索引的话,IO操作很耗时.
我们可以用”索引合并”.
索引合并的IO代价比全新生成要小,
索引合并命令:
/pach/sphinx/bin/indexer-c/path/conf-merge主索引增量索引---rotate
1:
增量索引的传统方法
Id
cnt
1
5
具体描述:
创建1张表做主索引已索引行的计数器,每隔5分钟,生成增量索引,合并到主索引
并且------把当前最大的id更新到计数器
2:
增量索引的新方法
生成主索引
并把最大id
写入计数器
5分钟全部把大于计数器的文档重新索引
具体做法:
1:
生成主索引,写入计数器
2:
每5分钟,根据计数器,全新生成增量索引
3:
每晚凌晨负载低时,合并主索引+增量索引
4:
每周固定某时间,全新生成总索引
疑问:
1天内,岂不是都查询不到增量索引的内容?
答:
查询是可以从多个索引来查询的
分布式索引
原理:
定义一个类型为distribute的索引,
并设置后台真正的索引源(本索引只是一个前台代理)
索引源可以是远程主机,通过HOST/IP来访问
indexdistribute{
type=distributed
agent=192.168.1.199:
9312:
shop
agent=192.168.1.199:
9312:
incre
}
索引源也可以是本地的
indexdistribute{
type=distributed
Local=shop
Local=incre
}
如果:
索引都是本地的,有什么意义呢?
1:
可以用的主索引+分布式索引的同时搜索上(不合并状态,从2个索引搜索)
2:
多核CPU的优化,可以更充分的利用多CPU的优势