使用PHP+Sphinx创建高效的站内搜索引擎

 

  1. 1.    为何要使用Sphinx

 

假设你如今运营着一个论坛,论坛数据已经超过100W,不少用户都反映论坛搜索的速度很是慢,那么这时你就能够考虑使用Sphinx了(固然其余的全文检索程序或方法也行)。php

 

  1. 2.    Sphinx是什么

 

Sphinx由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。mysql

全文检索是指以文档的所有文本信息做为检索对象的一种信息检索技术。检索的对象有多是文章的标题,也有多是文章的做者,也有多是文章摘要或内容。web

 

  1. 3.    Sphinx的特性

 

l  高速索引 (在新款CPU上,近10 MB/秒);sql

l  高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);数据库

l  高可用性 (单CPU上最大可支持100 GB的文本,100M文档);api

l  提供良好的相关性排名服务器

l  支持分布式搜索;分布式

l  提供文档摘要生成;工具

l  提供从MySQL内部的插件式存储引擎上搜索post

l  支持布尔,短语, 和近义词查询;

l  支持每一个文档多个全文检索域(默认最大32个);

l  支持每一个文档多属性;

l  支持断词;

l  支持单字节编码与UTF-8编码;

 

  1. 4.    下载并安装Sphinx

 

打开网址http://www.coreseek.cn/news/7/52/ 找到适合本身的操做系统的版本,好比我是Windows那么我就能够下载Coreseek Win32通用版本,Linux下能够下载源码包,本身编译安装。这里解释下为何咱们下载的程序叫Coreseek,Coreseek是基于Sphinx开发的一款软件,对Sphinx作了一些改动,在中文方面支持得比Sphinx好,因此咱们使用之。

下载完成后,将程序解压到你想解压的地方,好比我就想解压到E盘根目录,以后修改目录名为Coreseek,大功告成Coreseek安装完成了,安装的目录是在E:\coreseek\。

 

  1. 5.    使用Sphinx

 

我要使用Sphinx须要作如下几件事

1)        首先得有数据

2)        创建Sphinx配置文件

3)        生成索引

4)        启动Sphinx

5)        使用之(调用api或search.exe程序进行查询)

 

第1件:(导入数据)

咱们创建测试所须要用到得数据库、表以及数据,篇幅有限,这些在附件中都有,下载后导入MySQL便可。

 

第2件:(创建配置文件)

接下来咱们须要创建一个Sphinx的配置文件 E:\coreseek\etc\mysql.conf,将其内容改成下面这些:

source mysql

{

       type                                         = mysql

       sql_host                                    = localhost 

       sql_user                                    = root          

       sql_pass                                          =           

       sql_db                                      = test           

       sql_port                                    = 3306         

       sql_query_pre                         = SET NAMES utf8

       sql_query                                 = SELECT id,addtime,title,content FROM post

       sql_attr_timestamp                 = addtime

}

 

index mysql

{

       source                                      = mysql

       path                                         = E:/coreseek/var/data/mysql

       charset_dictpath                   = E:/coreseek/etc/

       charset_type                           = zh_cn.utf-8

}

 

searchd

{

       listen                                         = 9312

       max_matches                         = 1000

       pid_file                                     = E:/coreseek/var/log/searchd_mysql.pid

       log                                            = E:/coreseek/var/log/searchd_mysql.log

       query_log                                = E:/coreseek/var/log/query_mysql.log

}

 

先讲下这个配置文件中每项的含义。

source mysql{} 定义源名称为mysql,也能够叫其余的,好比:source xxx{}

type  数据源类型

sql_* 数据相关的配置,好比sql_host,sql_pass什么的,这些不解释鸟

sql_query 创建索引时的查询命令,在这里尽量不使用where或group by,将where与groupby的内容交给sphinx,由sphinx进行条件过滤与groupby效率会更高,注意:select 的字段必须包括一个惟一主键以及要全文检索的字段,where中要用到的字段也要select出来

sql_query_pre 在执行sql_query前执行的sql命令, 能够有多条

sql_attr 以这个开头的配置项,表示属性字段,在where,orderby,groupby中出现的字段要分别定义一个属性,定义不一样类型的字段要用不一样的属性名,好比上面的sql_attr_timestamp就是时间戳类型。

 

index mysql{} 定义索引名称为mysql,也能够叫其余的,好比:index xxx{}

source 关联源,就是source xxx定义的。

path 索引文件存放路径,好比:E:/coreseek/var/data/mysql 实际存放在E:/coreseek/var/data/目录,而后建立多个名称为mysql后缀却不一样的索引文件

charset_dictpath  指明分词法读取词典文件的位置,当启用分词法时,为必填项。在使用LibMMSeg做为分词 库时,须要确保词典文件uni.lib在指定的目录下

charset_type 字符集,好比charset_type = zh_cn.gbk

 

searchd{} sphinx守护进程配置

listen 监听端口

max_matches最大匹配数,也就是查找的数据再多也只返回这里设置的1000条

pid_file pid文件路径

log全文检索日志

query_log查询日志

 

好了,配置文件就这样,配置的参数还有不少,你们能够本身查文档。

 

第3件:(生成索引)

开始 -> 运行 -> 输入cmd回车,打开命令行工具

e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf --all

这一串东西其实就是调用indexer程序来生成全部索引

 

若是只想对某个数据源进行索引,则能够这样:e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf 索引名称(索引名称指配置文件中所定义的)

--config,--all这些都是indexer程序的参数,想了解更多参数的朋友能够查看文档

运行命令后若是你没看到FATAL,ERROR这些东西,那么索引文件就算生成成功了,好比我看到得就是

………省略………

using config file 'e:\coreseek\etc\mysql.conf'...

indexing index 'mysql'...

collected 4 docs, 0.0 MB

………省略………

 

第4件:(启动Sphinx)

一样命令行下

e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf

运行后提示了一大堆东西

using config file 'e:\coreseek\etc\mysql.conf'...

listening on all interfaces, port=9312

accepting connections

不用管这些鸟文是啥意思,反正Sphinx是启动好了。

如今有一串鸟文的这个命令行是不能关的,由于关了Sphinx也就关了,若是以为这样不爽,能够将Sphinx安装成系统服务,在后台运行。

安装系统服务只需在命令行中输入如下命令

e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf --install

安装以后记得启动这个服务,不会启动那我无法,本身google。

 

第5步:(使用Sphinx)

在web根目录下创建一个search目录(固然不在根目录也行,一样目录名也能够随取),复制E:\coreseek\api\ sphinxapi.php文件到search目录(sphinxapi.php这个是sphinx官方提供的api),开始php程序的编写。

在search目录创建一个文件,名字叫啥都行,我管它叫index.php,其内容以下

<?php

 

include 'sphinxapi.php';  // 加载Sphinx API

 

$sc = new SphinxClient(); // 实例化Api

$sc->setServer('localhost', 9312); // 设置服务端,第一个参数sphinx服务器地址,第二个sphinx监听端口

$res = $sc->query('sphinx', 'mysql'); // 执行查询,第一个参数查询的关键字,第二个查询的索引名称,mysql索引名称(这个也是在配置文件中定义的),多个索引名称以,分开,也能够用*表示全部索引。

print_r($res);

 

打印结果:

Array

(

   ………省略………

    [matches] => Array

        (

            [2] => Array

                (

                    [weight] => 2

                    [attrs] => Array

                        (

                            [addtime] => 1282622004

                        )

                )

            [4] => Array

                (

                    [weight] => 2

                    [attrs] => Array

                        (

                            [addtime] => 1282622079

                        )

                )

        )

  ………省略………

)

Matches中就是查询的结果了,可是仿佛不是咱们想要的数据,好比titile,content字段的内容就没有查询出来,根据官方的说明是Sphinx并无链接到MySQL去取数据,只是根据它本身的索引内容进行计算,所以若是想用Sphinx提供的API去取得咱们想要的数据,还必须以查询的结果为依据,再次查询MySQL从而获得咱们想要的数据。

 

查询结果中键值分别表示

 

2惟一主键

 

weight权重

attrs sql_attr_*中配置

至此,搜索引擎算是完成一大半了,剩下的你们能够自行完成。

 

好比:

 

<?php

$ids    = array_keys($res['matches']); // 获取主键

$ids = join(',', $ids);

$query  = mysql_query("SELECT * FROM post WHERE id IN ({$ids})");

while($row = mysql_fetch_assoc($query)) {

    .....

}

 

Sphinx的更多配置,程序的参数等,你们能够查看Sphinx的文档

当你有事情忙的时候,你会以为时间过得很快 很快。可能你会感受有点累。但这是一我的成功的历程。请坚信,我必定会好好的。
更多

相关文章
相关标签/搜索