Sphinx 全文搜索引擎.docx

上传人:b****8 文档编号:29744455 上传时间:2023-07-26 格式:DOCX 页数:10 大小:74.23KB
下载 相关 举报
Sphinx 全文搜索引擎.docx_第1页
第1页 / 共10页
Sphinx 全文搜索引擎.docx_第2页
第2页 / 共10页
Sphinx 全文搜索引擎.docx_第3页
第3页 / 共10页
Sphinx 全文搜索引擎.docx_第4页
第4页 / 共10页
Sphinx 全文搜索引擎.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

Sphinx 全文搜索引擎.docx

《Sphinx 全文搜索引擎.docx》由会员分享,可在线阅读,更多相关《Sphinx 全文搜索引擎.docx(10页珍藏版)》请在冰豆网上搜索。

Sphinx 全文搜索引擎.docx

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的优势

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 财会金融考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1