`
quxiaozuzhou
  • 浏览: 15619 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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

阅读更多
(本文于2010.10.01发表在《草根》杂志第四期,LAMP交流超级群(500人):106382633)
1.    为什么要使用Sphinx

假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方法也行)。

2.    Sphinx是什么

Sphinx由俄罗斯人Andrew Aksyonoff 开发的高性能全文搜索软件包,在GPL与商业协议双许可协议下发行。
全文检索是指以文档的全部文本信息作为检索对象的一种信息检索技术。检索的对象有可能是文章的标题,也有可能是文章的作者,也有可能是文章摘要或内容。

3.    Sphinx的特性

    高速索引 (在新款CPU上,近10 MB/秒);
    高速搜索 (2-4G的文本量中平均查询速度不到0.1秒);
    高可用性 (单CPU上最大可支持100 GB的文本,100M文档);
    提供良好的相关性排名
    支持分布式搜索;
    提供文档摘要生成;
    提供从MySQL内部的插件式存储引擎上搜索
    支持布尔,短语, 和近义词查询;
    支持每个文档多个全文检索域(默认最大32个);
    支持每个文档多属性;
    支持断词;
    支持单字节编码与UTF-8编码;

4.    下载并安装Sphinx

打开网址http://www.coreseek.cn/news/7/52/ 找到适合自己的操作系统的版本,比如我是Windows那么我就可以下载Coreseek Win32通用版本,Linux下可以下载源码包,自己编译安装。这里解释下为什么我们下载的程序叫Coreseek,Coreseek是基于Sphinx开发的一款软件,对Sphinx做了一些改动,在中文方面支持得比Sphinx好,所以我们使用之。
下载完成后,将程序解压到你想解压的地方,比如我就想解压到E盘根目录,之后修改目录名为Coreseek,大功告成Coreseek安装完成了,安装的目录是在E:\coreseek\。

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的文档。
分享到:
评论

相关推荐

    PHP高级工程师必知必会Nginx+keepalived+MongoDB+haproxy+Sphinx实现分布式集群部署实战视频

    **定义**:Sphinx是一款开源全文搜索引擎工具,可以集成到MySQL数据库中使用。 - **核心优势**: - 高效索引建立:支持批量文档导入与实时增量更新。 - 强大搜索能力:具备模糊匹配、近义词扩展等功能,提升查询...

    搭建Sphinx+MySQL5.1x+SphinxSE+mmseg中文分词搜索引擎架构

    Sphinx是一款高性能的全文搜索引擎,它独立于MySQL运行,但可以与MySQL配合使用来实现高效的全文检索功能。当Sphinx与MySQL结合部署时,其数据来源通常是从MySQL中读取的。为了实现这一功能,需要在`sphinx.conf`...

    数据库 搜索引擎 sphinx

    数据库搜索引擎Sphinx是一款高效、可定制且功能丰富的全文搜索引擎,主要设计用于Web应用,以便快速地从大量数据中检索相关信息。Sphinx的核心特性包括实时索引、近实时搜索以及高度可扩展性,使得它在处理大数据量...

    sphinx-2.2.10-release-win32.zip

    使用PHP+Sphinx建立高效的站内搜索引擎 假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方法也行)。

    PHP 全文检索引擎 Sphinx 介绍

    Sphinx是一个高性能、开源的全文检索引擎,专为配合SQL数据库而设计,如MySQL和PostgreSQL,用于实现高效且专业的全文搜索功能。它的核心优势在于能够提供比数据库原生搜索更强大的搜索性能,并且易于集成到各种使用...

    php 搜索Sphinx

    在实际应用中,PHP开发者可以通过Sphinx提供的PHP扩展(sphinxapi)与之进行交互,从而实现数据的高效搜索。以下是使用PHP与Sphinx交互的基本步骤: 1. **安装Sphinx**:首先,需要在服务器上安装Sphinx。这通常...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1_张宴

    Sphinx 是一个高性能的全文搜索引擎,常用于网站和应用程序中,提供快速且精确的搜索功能。它不依赖于传统的数据库,而是使用自己的索引结构,能够显著提高搜索效率。Sphinx 支持多种数据源,如 MySQL,允许开发者将...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)[收集].pdf

    总结,Sphinx搜索引擎以其高效、灵活的特点,成为许多网站实现全文搜索功能的首选。结合MySQL,可以构建出一个强大的、适应性强的搜索解决方案,满足各种复杂的业务需求。正确安装和配置Sphinx,能够极大地提升网站...

    sphinx+php检索引擎

    ### Sphinx+PHP检索引擎知识点详解 #### 一、为什么要使用Sphinx 假设您正在运营一个拥有超过一百万条记录的大型论坛。随着数据量的增长,用户可能会反馈说论坛的搜索功能变得异常缓慢,这不仅降低了用户体验,还...

    php7.3-sphinx.zip

    Sphinx是一个高效全文搜索引擎,常被用于网站后台提供强大的检索功能。在PHP中,Sphinx提供了PHP扩展,使得开发者能够更方便地与Sphinx服务器进行交互。本文将重点讨论PHP7.3版本下的Sphinx扩展,以及如何在Linux...

    sphinx+mysql 安装手册

    Sphinx是一款高性能的全文搜索引擎,常用于构建高效的数据检索系统。结合MySQL数据库,可以构建出强大的、适用于千万级数据的全文检索解决方案。本手册将详细讲解如何在生产环境中安装和配置Sphinx以及与MySQL的集成...

    PHP实例开发源码—PhpSou搜索引擎(整合sphinx).zip

    在PhpSou搜索引擎中,Sphinx被用来处理实际的搜索任务,通过建立和维护数据的倒排索引来实现快速匹配用户输入的关键词。 整合Sphinx与PHP的过程中,开发者可能需要了解以下关键点: 1. **安装和配置Sphinx**: 包括...

    张宴Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.doc

    ### Sphinx搜索引擎架构与使用知识点详解 #### 一、搜索引擎架构设计 Sphinx搜索引擎的设计与部署,结合了PHP、MySQL和Sphinx自身的优势,构建了一个高效、可扩展的搜索平台。以下是对架构设计的关键点的详细解析...

    基于PHP的Sphinx php全文检索引擎 for Linux.zip

    Sphinx 是一个高性能、全文本搜索引擎,设计用于在大量数据中快速进行高效搜索。它最初是为了配合MySQL数据库而开发的,但现在已经被广泛应用于各种Web应用程序,包括PHP开发的项目。这个“基于PHP的Sphinx php全文...

    基于PHP的Sphinx全文检索引擎php版 for Windows.zip

    标题 "基于PHP的Sphinx全文检索引擎php版 for Windows.zip" 暗示了这是一个针对Windows操作系统的Sphinx全文搜索引擎的PHP接口版本。Sphinx是一个开源的、高性能的全文搜索引擎,广泛应用于网站内容搜索和数据索引。...

    PHP搜索引擎

    在实际应用中,PHP搜索引擎的实现可以结合多种技术,例如MySQL作为数据库存储网页内容,Apache Solr或Elasticsearch作为强大的搜索服务,以及PHP的全文搜索库如Xapian或Sphinx。这些工具和技术可以提高搜索引擎的...

Global site tag (gtag.js) - Google Analytics