天天看点

服务器架构之性能扩展-第八章(9) 第八章:Sphinx全文检索  

生活中总会和数据打交道,数据一般分为结构化数据(具有自动固定格式或有限长度数据)和非结构化数据,非结构化数据又称全文数据。

全文索引的扫描大致分为索引的创建和搜索索引两个过程。

<b>索引创建:</b>将现实世界的所有结构化数据和非结构化数据提取信息,建立索引的过程。

<b>索引搜索:</b>就是得到用户的查询请求,搜索创建的索引,返回结果的过程。

<b>创建索引具体过程:</b><b></b>

<b></b>

1、          首先创建需要索引的文档

2、          将源文档传给分词词组(tokenizer)。分词词组会将文档分成一个一个的单独单词,去掉标点,去掉停词(的,这等)

3、          将的得到的词元(token)传给语言处理组件(linguistic processor)。它主要进行单词变为小写,复数改为单数(cars-&gt;car),过去式转给原始等。

4、          将得到的词(term)传给索引组件(indexer)。它进行创建一个字典,并按字母排序。

<b>索引搜索具体过程:</b><b></b>

1、          用户输入查询语句

2、          对查询语句进行语法分析,语言处理

3、          搜索索引,得到合法树的文档

4、          根据得到的文档和查询语句的相关性,进行排序

<a href="http://blog.51cto.com/attachment/201209/234032557.png" target="_blank"></a>

Sphinx是SQL phrase index(查询词组索引)的缩写,sphinx是一个基于SQL的全文检索引擎。Coreseek是支持中文的全文检索引擎。

<a href="http://blog.51cto.com/attachment/201209/234051231.png" target="_blank"></a>

用处:当数据的量增大对搜索有更高要求时;当用户放映搜索慢时;当需要设计千万级亿级别的架构时

Sphinx优点:检索速度快,对于2-4G数据只要0.1秒,提供分布式搜索,可以为mysql提供检索,支持多个检索字段

缺点:必须有主键,主键为整形,不负责数据存储,配置不灵活

Sphinx全文索引工作在php和mysql之间,完成数据的检索。

Tar zxvf sphinx-0.9.9.tar.gz

Cd sphinx-0.9.9

./configure –prefix=/usr/local/sphinx –with-mysql=/usr/local/mysql

Make &amp;&amp; make install

这时在sphinx/bin目录下会有三个命令。Indexer:创建索引;seachd:启动进程;seach:搜索命令。

我们创建一个主键为整形的表,添加数据。

<a href="http://blog.51cto.com/attachment/201209/234110314.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/234122431.png" target="_blank"></a>

安装完毕会在sphinx/etc目录下生成一个sphinx.conf.disk的示例配置,修改即可。这个配置文件包括朱数据源文件,增量数据文件,主索引,增量索引,所引器和服务进程组成的。

<a href="http://blog.51cto.com/attachment/201209/234140972.png" target="_blank"></a>

1、主数据源是源数据,后期添加数据为增量数据源

Source src1改为source main作为主数据源,然后配置数据库信息

<a href="http://blog.51cto.com/attachment/201209/234157608.png" target="_blank"></a>

指定socket位置

<a href="http://blog.51cto.com/attachment/201209/234219153.png" target="_blank"></a>

设置mysql字符集,关闭缓存

<a href="http://blog.51cto.com/attachment/201209/234233347.png" target="_blank"></a>

指定数据sql语句

<a href="http://blog.51cto.com/attachment/201209/234252449.png" target="_blank"></a>

注释掉这些默认的信息

<a href="http://blog.51cto.com/attachment/201209/234316933.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/234330241.png" target="_blank"></a>

更改查询的数据库

<a href="http://blog.51cto.com/attachment/201209/234347265.png" target="_blank"></a>

注释主数据索引

<a href="http://blog.51cto.com/attachment/201209/234402952.png" target="_blank"></a>

指定字符集

<a href="http://blog.51cto.com/attachment/201209/234415634.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/234431763.png" target="_blank"></a>

注释增量索引。

<a href="http://blog.51cto.com/attachment/201209/234456516.png" target="_blank"></a>

:494,525s/^/#/g   //批量注释分布式索引

<a href="http://blog.51cto.com/attachment/201209/234512295.png" target="_blank"></a>

索引器设置内存,默认32MB

<a href="http://blog.51cto.com/attachment/201209/234530584.png" target="_blank"></a>

服务器进程设置端口,默认即可

<a href="http://blog.51cto.com/attachment/201209/234543698.png" target="_blank"></a>

/usr/local/sphinx/bin/bin/indexer –c /usr/local/sphinx/etc/sphinx.conf –all

-c 指定配置文件,--all对所有索引重新编译

<a href="http://blog.51cto.com/attachment/201209/234701531.png" target="_blank"></a>

Cp /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib

<a href="http://blog.51cto.com/attachment/201209/234919216.png" target="_blank"></a>

./search linux   //测试  

<a href="http://blog.51cto.com/attachment/201209/234848472.png" target="_blank"></a>

新插入数据后直接搜索还是搜不到,只有重新索引后才可。

<a href="http://blog.51cto.com/attachment/201209/234935789.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/235000550.png" target="_blank"></a>

insert into saisai values(5,”spider”,”斯百德”); //插入中文,测试中文索引

<a href="http://blog.51cto.com/attachment/201209/235014971.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/235031973.png" target="_blank"></a>

测试不通过

<a href="http://blog.51cto.com/attachment/201209/235045985.png" target="_blank"></a>

Sphinx默认是不支持中文的,我们需要引入coreseek进行中文索引,因为它包含了mmseg中文分词组件。

Tar zxvf coreseek-3.2.14.tar.gz

解压后,分别是sphinx文件csft和中文字符文件mmseg,说明文件和链接文件

<a href="http://blog.51cto.com/attachment/201209/235102242.png" target="_blank"></a>

Cd coreseek-3.2.14/mmseg    //先安装中文分词,然后整合进去

./configure –prefix=/usr/local/mmseg

会报错:config.status: error: cannot find input file: src/Makefile.in

<a href="http://blog.51cto.com/attachment/201209/235116168.png" target="_blank"></a>

automake  //执行automake,自动配置环境

<a href="http://blog.51cto.com/attachment/201209/235136553.png" target="_blank"></a>

接下来sphinx和mmseg结合

Cd coreseek-3.2.14/csft-3.2.14/

./configure --prefix=/usr/local/coreseek --with-mysql=/usr/local/mysql --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/

最后:Make &amp;&amp; make install

<a href="http://blog.51cto.com/attachment/201209/235153554.png" target="_blank"></a>

Cp /usr/local/csft/etc/sphinx.conf.disk  /usr/local/csft/ect/csft.conf

与sphinx其他都一样,只要在main主数据文件“#charset_type=sbcs”

后增加“charset_type=zh_cn.utf-8”和“charset_dictpath=/usr/local/mmseg/etc”指定字符集和mmseg安装目录即可

<a href="http://blog.51cto.com/attachment/201209/235216704.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/235231102.png" target="_blank"></a>

然后重新刷新索引进行测试即可,还可以看到他还识别词组

<a href="http://blog.51cto.com/attachment/201209/235321451.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/235347675.png" target="_blank"></a>

对于英文字符间有空格比较直观,而中文却不行。并且中文拥有一些容易歧义的语句,更是增加了难度。

分词的算法:

1、              基于字符串匹配的分词方法:它是基于词典的分词方法。有正向,逆向和双向的顺序,又有最大,最小,逐词和最佳。

2、              基于理解的分词方法:人机模拟,目前测试阶段

3、              基于统计的分词方法:根据概率来的

Sphinx集成到php需要两种方式:

1.       sphinx php模块

2.       sphinxapi类

到/csf-3.12.12/api下可以看到sphinxapi.php模块

<a href="http://blog.51cto.com/attachment/201209/235408461.png" target="_blank"></a>

要想在php程序中开启sphinx必须启动sphinx服务,到/usr/local/coreseek/bin下有searchd命令,可以控制sphinx。

参数:-c 指定配置文件,--stop停止服务,--pidfile指定pid文件,-p指定端口

<a href="http://blog.51cto.com/attachment/201209/235444386.png" target="_blank"></a>

Tar zxvf sphin-1.1.0.tgz

Cd sphin-1.1.0

/usr/local/php/bin/phpize   //加载模块

./configure –with-php-config=/usr/local/php/bin/php-config  //报错

<a href="http://blog.51cto.com/attachment/201209/235459329.png" target="_blank"></a>

我们先安装cd core-3.2.14/csf-3.214/api/libclient

./configure

然后cd sphinx-1.1.0

./configure –with-php-config=/usr/local/php/bin/php-config

<a href="http://blog.51cto.com/attachment/201209/235806605.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/235826823.png" target="_blank"></a>

 cd   /usr/local/php5/lib/php/extensions/no-debug-zts-20090626/

<a href="http://blog.51cto.com/attachment/201209/235840697.png" target="_blank"></a>

Vi /etc/php.ini  //加载sphinx.so模块

<a href="http://blog.51cto.com/attachment/201209/235857801.png" target="_blank"></a>

/usr/local/apache2/bin/apachectl restart   //重启apache

192.168.211.128/info.php  //看到sphinx模块

<a href="http://blog.51cto.com/attachment/201209/235920228.png" target="_blank"></a>

Cp coreseek-3.2.14/csf-3.2.14/api/sphinxapi.php /usr/local/apache2/htdocs/include/sphinxapi.php  //加载类

Yum install samba*

<a href="http://blog.51cto.com/attachment/201209/235937750.png" target="_blank"></a>

配置samba

<a href="http://blog.51cto.com/attachment/201209/235951736.png" target="_blank"></a>

复制home的选项,新建一个web的目录,重启服务

<a href="http://blog.51cto.com/attachment/201209/000002982.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/000019569.png" target="_blank"></a>

创建一个smb用户

<a href="http://blog.51cto.com/attachment/201209/000037662.png" target="_blank"></a>

开始- 》运行-》\\192.168.211.128\web

<a href="http://blog.51cto.com/attachment/201209/000050809.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/000102698.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/000114343.png" target="_blank"></a>

创建磁盘映射,计算机-&gt;映射网络驱动器

<a href="http://blog.51cto.com/attachment/201209/000128685.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/000142816.png" target="_blank"></a>

确定即可创立一个映射磁盘

<a href="http://blog.51cto.com/attachment/201209/000157933.png" target="_blank"></a>

插入数据拒绝

<a href="http://blog.51cto.com/attachment/201209/000211295.png" target="_blank"></a>

我们知道apache使用apache用户,我们最好让映射磁盘也使用apache用户,这样可以保证windows下创建的文件可以直接访问。

<a href="http://blog.51cto.com/attachment/201209/000224153.png" target="_blank"></a>

Net usr /delete *   //删除磁盘映射

<a href="http://blog.51cto.com/attachment/201209/000235242.png" target="_blank"></a>

创建新的用户,我们使用新的apache用户登录

<a href="http://blog.51cto.com/attachment/201209/000249740.png" target="_blank"></a>

创建文件可以看到是apache用户

<a href="http://blog.51cto.com/attachment/201209/000302610.png" target="_blank"></a>

这样就实现了windows和linux的同步。

<a href="http://blog.51cto.com/attachment/201209/000315174.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/000328383.png" target="_blank"></a>

传一个数据过来,建立一个新的sphinx客户端,连接到9312端口,any和all两种,any这里选择是任意的,all是指只包含,通过query搜索关键词,*任意索引,至此得到文档id。

<a href="http://blog.51cto.com/attachment/201209/000345483.png" target="_blank"></a>

<a href="http://blog.51cto.com/attachment/201209/000358120.png" target="_blank"></a>

本文转自zsaisai 51CTO博客,原文链接:http://blog.51cto.com/3402313/989242