Sphinx 全文搜索引擎.docx
- 文档编号:29744455
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:10
- 大小:74.23KB
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的优势
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Sphinx 全文搜索引擎 全文 搜索引擎