仓酷云

标题: PHP网页编程之用 PHP 构建自界说搜刮引擎 [打印本页]

作者: 兰色精灵    时间: 2015-2-3 23:52
标题: PHP网页编程之用 PHP 构建自界说搜刮引擎
HTML中的任何元素都要亲自实践,只有明白了什么元素会起到什么效果之后,你才会记忆深刻,而一味的啃书,绝对是不行的,我想大部分新手之所以觉得概念难学,大部分是一个字“懒”,懒是阻止进步的最大敌人,所以克服掉懒的习惯,才能更快的学好一样东西。   固然 Google 及其系列产物几近无所不克不及,然而 Web 模式的壮大搜刮引擎其实不能很好地合用于每一个站点。假如站点内容已被高度专业化或已明白分类,那就需求利用 Sphinx 和 PHP 来创立一个优化的当地搜刮体系。
在 Internet 时期,人们但愿信息可以像快餐一样被打包起来:可以疾速无妨碍利用,而且分为很小的单元(或是以字节 巨细为单元?)。实践上,为了知足暴躁而又渴求信息的用户的需求,乃至最通俗的 Web 站点如今都请求具有疾速阅读款式的各类菜单:
·RSS 是比萨快递员,会把新颖出炉的比萨奉上门。
·收集日记是外地的西餐馆,为您献上喜欢的风味菜肴。
·服装论坛是屡见不鲜(或能够更得当地说,“植物屋” 中争夺食品的场景)。
·而搜刮就像在外地的餐厅吃自助晚饭一样:不休将想吃的食品填满盘子就行,只需您的食道 —— 还有您的椅子 —— 撑得住。
侥幸的是,PHP 开辟人员可以找到各类 RSS、blog 和服装论坛软件来创立或改善站点。并且,固然 Google 和其他搜刮站点几近无所不克不及而且履行过滤通讯,然而搜刮引擎其实不必定会优秀地顺应各个站点。
例如,假如 Web 站点供应成百上千的全新和创新的保时捷汽车零件,Google 能够经由过程诸如 “Carrera parts” 之类的狭义搜刮找到您的站点,然而关于更详细的 “used 1991 Porsche 911 Targa headlight bezel” 查询,它能够不会失掉准确了局。
假如站点内容高度专业化,或会见者希冀搜刮功效与实际任务流相似,那末最好在 Web 的全局搜刮引擎基本上增添一个为您的站点量身定做的当地搜刮体系(有关专业化搜刮的更多实例,请参阅 “A needle in a billion haystacks”)。
经由过程本文懂得若何向 PHP 站点中添加一个疾速、高效、开源和收费的搜刮引擎。本文没有开辟可见的 Web 站点。相反,重点会商交付无效搜刮了局所需的组件:数据库、索引、搜刮引擎和 PHP 使用法式编程接口 (API)。
会见优异的 sphinx
要为站点供应自界说搜刮功效,您必需无数据源和搜刮该数据源的功效。关于 Web 使用法式,数据源凡是是一个关系数据库,个中内置了一些搜刮功效(Equality 是一个复杂的搜刮运算符,与 SQL 运算符 LIKE 一样)。然而,一些搜刮能够比数据库可以履行的搜刮加倍详细,或搜刮能够过于庞杂,而招致固有的 SQL JOIN 反响愚钝。
大海捞针
很多站点供应特定于某一个行业、职业或文娱的内容,例如医药、功令、音乐和汽车维修。深切研讨这些内容能够请求利用特别东西或培训,或仅需求利用一个索引来生成相干的适用了局。
上面是一些需求定制搜刮体系的罕见搜刮场景:
·查找 Joe Hockey 所撰写的关于斯坦利杯 (Stanley Cup) 的一切文章。
·查找 HP LaserJet 3015 All-in-One 打印机的最新驱动法式。
·查找 Dinosaur Jr. 介入大卫深夜脱口秀节目标电视片断。
要减速搜刮,您可以从头布置表,并由此简化底层查询(表和 SQL 查询优化高度依附于形式和引擎。可经由过程在线搜刮查找有关数据库功能的各类文章和书本)。另外,您可以添加一个专门化的搜刮引擎。使用哪一种模式的搜刮引擎还依附于数据的模式(和数目)和预算。有很多选择可用:您可以将一个 Google 东西毗连到您的收集中,购置 Endeca 或其他大型贸易搜刮产物,或测验考试 Lucene。然而在良多情形下,利用贸易产物都有点小题大做,或华侈运营预算,而且 Lucene 在 2007 年 7 月编写时并未供应 PHP API。
作为一个备选计划,思索一下 Sphinx,它是一种开源和收费的搜刮引擎,可以十分疾速地搜刮文本。例如,在一个几近有 300,000 行及五个索引列(每列包括大约 15 个单词)的举动数据库中,Sphinx 可以在 1/100 秒内失掉 “这些单词中任何一个单词” 的搜刮了局(在运转 Debian Linux? Sarge 的 2-GHz AMD Opteron 处置器、1 GB RAM 的盘算机上)。
Sphinx 供应了大批功效,包含:
·它可觉得可以暗示为字符串的一切数据创立索引。
·它可以以各类体例为不异数据创立索引。关于多个索引,每一个索引都针对特定目标而定制,您可以选择最恰当的索引来优化搜刮了局。
·它可以把属性与每条索引数据联系关系起来。然后您可使用一个或多个属性来进一步过滤搜刮了局。
·它撑持词法,因而搜刮单词 “cats” 还会找到词根 “cat”。
·您可以在很多盘算机平分发 Sphinx 索引,从而供应毛病恢复功效。
·它可以创立恣意长度的单词前缀索引和可变长度的中缀子字符串的索引。例如,一个零件号可所以 10 个字符宽。前缀索引将婚配位于字符串开首处的一切能够的子字符串。中缀索引将婚配在字符串内恣意地位的子字符串。
·您可以在 MySQL V5 内将其作为存储引擎运转,下降利用其他守护法式的需求(凡是被视为另外一个毛病点)。
您可以在 Sphinx 源代码附带的 README 文件中或经由过程在线材料找到完全的功效列表。Sphinx Web 站点还列出了已安排了 Sphinx 的若干个项目。
Sphinx 是用 C++ 编写、用 GNU 编译器构建、撑持 64 位撑持平台,并在 Linux、UNIX?、Microsoft? Windows? 和 Mac OS X 上运转。构建 Sphinx 非常复杂:下载并解紧缩代码,然后运转 ./configure && make && make install 号令。
默许情形下,Sphinx 适用法式将被装置到 /usr/local/bin/ 中,而且一切 Sphinx 组件的设置装备摆设文件都位于 /usr/local/etc/sphinx.conf 中。
Sphinx 有三个组件:索引生成器、搜刮引擎和号令行 search 适用法式:
·索引生成器被称为索引器。它将查询数据库,为了局的每行中的每列创立索引,而且将每一个索引条目绑定到行的主键上。
·搜刮引擎是名为 searchd 的守护法式。该守护法式将吸收搜刮词和其他参数,疾速遍历一个或多个索引,并前往了局。假如找到婚配,searchd 将前往一个主键数组。关于这些键,使用法式可以针对相干数据库运转查询来查找包括婚配的完全纪录。Searchd 将在端口 3312 上经由过程套接字毗连与使用法式停止通讯。
·便捷的 search 适用法式使您可以从号令行机关搜刮而无需编写代码。假如 searchd 前往婚配,则 search 将查询数据库并显示婚配集中的行。search 适用法式关于调试 Sphinx 设置装备摆设和履行一时搜刮非常有效。
另外,Sphinx 的作者 Andrew Aksyonoff 和其他奉献者为 PHP、Perl、C/C++ 和其他编程言语供应了 API。
搜刮车身零件
假定 Body-Parts.com 出售车身零件 —— 挡泥板、铬、缓冲器等 —— 用于名贵且值得保藏的汽车。正如在实际世界中,Body Parts 站点的会见者极可能按制作商(好比保时捷或制作同类零件的第三方制作商)、零件号、产地、车型、年份、前提(二手、全新、创新)和描写或这些属性的某种组合来搜刮零件。
要构建 Body Parts 搜刮功效,让咱们利用 MySQL V5.0 作为数据存储并利用 Sphinx search 守护法式来供应疾速而准确的文本搜刮。MySQL V5.0 是一个功效壮大的数据库,然而它的加强型全文本搜刮功效其实不出格丰厚。实践上,它仅限于 MyISAM 表 —— 不撑持外键的一种表格局,因而利用无限。
清单 1 至清单 4 显示了与此示例相干的 Body Parts 形式的局部代码。您将分离看到 Model(清单 1)、Assembly(清单 2)、Inventory(清单 3)和 Schematic(清单 4)表。
Model 表
清单 1 中所示的 Model 表非常复杂:label 列将罗列车型的称号 (“Corvette”);description 利用客户友爱体例停止描写(“两门跑车;第一年引入”);而 begin_production 和 end_production 分离暗示入手下手临盆和停止临盆该车型的年份。因为前述列中的值其实不唯一,因而利用一个自力 ID 暗示每四个如许的元素(label、description、begin_production、end_production),而且是其他表中的外键。
清单 1. 车身零件 Model 表
以下为援用的内容:
CREATE TABLE Model (
id int(10) unsigned NOT NULL auto_increment,
label varchar(7) NOT NULL,
description varchar(256) NOT NULL,
begin_production int(4) NOT NULL,
end_production int(4) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
上面是 Model 表的一些样例数据:
以下为援用的内容:
INSERT INTO Model
(`id`, `label`, `description`, `begin_production`, `end_production`)
VALUES
(1,'X Sedan','Four-door performance sedan',1998,1999),
(3,'X Sedan','Four door performance sedan, 1st model year',1995,1997),
(4,'J Convertible','Two-door roadster, metal retracting roof',2002,2005),
(5,'J Convertible','Two-door roadster',2000,2001),
(7,'W Wagon','Four-door, all-wheel drive sport station wagon',2007,0);
Assembly 表
assembly 是一个子体系,例如汽车上装置的传动安装或一切玻璃。车主利用部件图及相干零件列表来查找备件。清单 2 中所示的 Assembly 表也非常复杂:它将把一个唯一 ID 与部件标签和描写联系关系起来。
清单 2. Assembly 表
以下为援用的内容:
CREATE TABLE Assembly (
id int(10) unsigned NOT NULL auto_increment,
label varchar(7) NOT NULL,
description varchar(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
持续示例,上面是 Assembly 表的一些样例数据:
以下为援用的内容:
INSERT INTO Assembly
(`id`, `label`, `description`)
VALUES
(1,'5-00','Seats'),
(2,'4-00','Electrical'),
(3,'3-00','Glasses'),
(4,'2-00','Frame'),
(5,'1-00','Engine'),
(7,'101-00','Accessories');
Inventory 表
Inventory 表是汽车零件的典型列表。零件 —— 例如螺钉或灯胆 —— 能够用于每辆汽车和多个部件中,然而零件只在 Inventory 表中显示一次。Inventory 表中的每行包括:
·利用了唯一的 32 位整数 serialno 标识行。
·字母数字零件号(此零件号唯一而且可以用作主键。然而,因为它可以包括字母数字字符,因而它不适于与 Sphinx 联合利用,Sphinx 请求索引的每笔记录都有一个唯一的 32 位整型键)。
·文本描写。
·价钱。
Inventory 表的标准如清单 3 中所示:
清单 3. Inventory 表
以下为援用的内容:
CREATE TABLE Inventory (
id int(10) unsigned NOT NULL auto_increment,
partno varchar(32) NOT NULL,
description varchar(256) NOT NULL,
price float unsigned NOT NULL default '0',
PRIMARY KEY (id),
UNIQUE KEY partno USING BTREE (partno)
) ENGINE=InnoDB;
零件的(局部)列表能够以下面所示:
INSERT INTO `Inventory`
(`id`, `partno`, `description`, `price`)
VALUES
(1,'WIN408','Portal window',423),
(2,'ACC711','Jack kit',110),
(3,'ACC43','Rear-view mirror',55),
(4,'ACC5409','Cigarette lighter',20),
(5,'WIN958','Windshield, front',500),
(6,'765432','Bolt',0.1),
(7,'ENG001','Entire engine',10000),
(8,'ENG088','Cylinder head',55),
(9,'ENG976','Large cylinder head',65);

Schematic 表
Schematic 表将把零件与部件和车型版本绑定在一同。因而,将利用 Schematic 表来查找组装 1979 J Class 敞篷车引擎的一切零件。Schematic 表中的每行都有一个唯一 ID,一个援用 Inventory 表行的外键,一个标识部件的外键,和用于援用 Model 表中特定型号和版本的另外一个键。各行如清单 4 所示:
清单 4. Schematic 表
以下为援用的内容:
CREATE TABLE Schematic (
id int(10) unsigned NOT NULL auto_increment,
partno_id int(10) unsigned NOT NULL,
assembly_id int(10) unsigned NOT NULL,
model_id int(10) unsigned NOT NULL,
PRIMARY KEY (id),
KEY partno_index USING BTREE (partno_id),
KEY assembly_index USING BTREE (assembly_id),
KEY model_index USING BTREE (model_id),
FOREIGN KEY (partno_id) REFERENCES Inventory(id),
FOREIGN KEY (assembly_id) REFERENCES Assembly(id),
FOREIGN KEY (model_id) REFERENCES Model(id)
) ENGINE=InnoDB;
为了强化表的意图,上面是 Schematic 中的一张小型行列表:
以下为援用的内容:
INSERT INTO `Schematic`
(`id`, `partno_id`, `assembly_id`, `model_id`)
VALUES
(1,6,5,1),
(2,8,5,1),
(3,1,3,1),
(4,5,3,1),
(5,8,5,7),
(6,6,5,7),
(7,4,7,3),
(8,9,5,3);
搜刮表
界说了这些表后,就能够轻松地呼应良多搜刮:
·显示特定型号的一切版本
·列出拆卸特别型号和版本所需的一切部件
·显示组成特定型号和版本的特别部件的一切零件
然而良多搜刮价值较大:
·查找一切模子和版本中呈现零件号开首为 “WIN” 的一切零件
·查找描写中有 “lacquer” 或 “paint” 的那些零件
·查找描写中有 “black leather” 的一切零件
·查找描写中有 “paint” 的一切 2002 J 系列零件
这些搜刮中的每一个搜刮都请求利用长篇的 JOIN 子句或价值奋发的 LIKE 子句,特别是在 Inventory 表和 Schematic 表非常大时更是如斯。并且,庞杂的文本搜刮完整超越了 MySQL 的才能。要搜刮大批文本数据,请思索构建和利用 Sphinx 索引。
集成 Sphinx 软件
要使用 Sphinx 来处理成绩,您必需界说一个或多个数据源和一个或多个索引。
source 将标识数据库来创立索引,供应验证信息,而且界说查询用以机关每行。数据源可以随便地标识一列或多列作为过滤器,Sphinx 将之称为组。您将利用组来过滤了局。例如,单词描写能够失掉 900 个婚配。假如只对特定型号的汽车婚配感乐趣,则可以进一步利用型号组停止过滤。
index 将请求取得数据源(即一组数据行)并界说应该若何为已从数据源中提掏出来的数据编目。
您将在 sphinx.conf 文件中界说数据源和索引。Body Parts 的数据源是 MySQL 数据库。清单 5 显示了名为 catalog 的数据源的局部界说 —— 指定毗连的数据库和若何创立毗连(主机、套接字、用户和暗码)的代码片断。
清单 5. 用于会见 MySQL 数据库的设置
以下为援用的内容:
source catalog
{
type = mysql
sql_host = localhost
sql_user = reaper
sql_pass = s3cr3t
sql_db = body_parts
sql_sock = /var/run/mysqld/mysqld.sock
sql_port = 3306

接上去,创立一个查询以生成要被索引的行。凡是,将创立 SELECT 子句,能够需求把很多表 JOIN 在一同才干失掉行。但这里存在一个成绩:搜刮型号和年份必需利用 Assembly 表,然而零件号和零件描写只能在 Inventory 表中找到。为此,Sphinx 必需可以把搜刮了局与 32 位整型主键绑定在一同。
要取得右边表单中的数据,需求创立一个视图 —— MySQL V5 中的新布局,它将把来自其他表的列整合到独自的分解虚拟表中。利用视图,各类搜刮所需的一切数据都在一个地位,然而举动数据实践上存在于其他表中。清单 6 显示了界说 Catalog 视图的 SQL。
清单 6. Catalog 视图将把数据整合到虚拟表中
以下为援用的内容:
CREATE OR REPLACE VIEW Catalog AS
SELECT
 Inventory.id,
 Inventory.partno,
 Inventory.description,
 Assembly.id AS assembly,
 Model.id AS model
FROM
 Assembly, Inventory, Model, Schematic
WHERE
 Schematic.partno_id=Inventory.id
AND Schematic.model_id=Model.id
AND Schematic.assembly_id=Assembly.id;
假如用后面所示的表和数据创立名为 body_parts 的数据库,则 Catalog 视图应该相似以下内容:
以下为援用的内容:
mysql> use body_parts;
Database changed
mysql> select * from Catalog;
+----+---------+---------------------+----------+-------+
| id | partno | description | assembly | model |
+----+---------+---------------------+----------+-------+
| 6 | 765432 | Bolt | 5 | 1 |
| 8 | ENG088 | Cylinder head | 5 | 1 |
| 1 | WIN408 | Portal window | 3 | 1 |
| 5 | WIN958 | Windshield, front | 3 | 1 |
| 4 | ACC5409 | Cigarette lighter | 7 | 3 |
| 9 | ENG976 | Large cylinder head | 5 | 3 |
| 8 | ENG088 | Cylinder head | 5 | 7 |
| 6 | 765432 | Bolt | 5 | 7 |
+----+---------+---------------------+----------+-------+
8 rows in set (0.00 sec)
在视图中,字段 id 将指回 Inventory 表中的零件条目。partno 和 description 列是要搜刮的次要文本,而 assembly 和 model 列用作进一步过滤了局的组。视图停当后,机关数据源查询就是大事一桩。清单 7 显示了 catalog 数据源界说的其他局部。
清单 7. 查询创立待索引的行
以下为援用的内容:
# indexer query
# document_id MUST be the very first field
# document_id MUST be positive (non-zero, non-negative)
# document_id MUST fit into 32 bits
# document_id MUST be unique
sql_query = \
SELECT \
 id, partno, description, \
 assembly, model \
FROM \
 Catalog;
 sql_group_column = assembly
 sql_group_column = model
 # document info query
 # ONLY used by search utility to display document information
 # MUST be able to fetch document info by its id, therefore
 # MUST contain '$id' macro
 #
 sql_query_info = SELECT * FROM Inventory WHERE id=$id
}

sql_query 必需包含后续查找需求利用的主键,而且它必需包含需求索引和用作组的一切字段。两个 sql_group_column 条目将声明 Assembly 和 Model 可用于过滤了局。而且 search 适用法式将利用 sql_query_info 来查找婚配纪录。在查询中,$id 被交换为 searchd 前往的每一个主键。
最初一个设置装备摆设步调是构建索引。清单 8 显示了数据源 catalog 的索引。
清单 8. 描写 catalog 数据源的一个能够的索引
以下为援用的内容:
index catalog
{
 source = catalog
 path = /var/data/sphinx/catalog
 morphology = stem_en
 min_word_len = 3
 min_prefix_len = 0
 min_infix_len = 3
}

第 1 即将指向 sphinx.conf 文件中的指定命据源。第 2 即将界说存储索引数据的地位;依照商定,Sphinx 索引将被存储到 /var/data/sphinx 中。第 3 即将答应索引利用英文词法。而且第 5 行至第 7 即将告知索引器只索引含有三个字符或更多字符的那些单词,而且为每一个如许的字符的子字符串创立中缀索引(为了便于援用,清单 9 显示了 Body Parts 的完全示例 sphinx.conf 文件)。
清单 9. Body Parts 的示例 sphinx.conf
以下为援用的内容:
source catalog
{
 type = mysql
 sql_host = localhost
 sql_user = reaper
 sql_pass = s3cr3t
 sql_db = body_parts
 sql_sock = /var/run/mysqld/mysqld.sock
 sql_port = 3306
 # indexer query
 # document_id MUST be the very first field
 # document_id MUST be positive (non-zero, non-negative)
 # document_id MUST fit into 32 bits
 # document_id MUST be unique
 sql_query = \
SELECT \
 id, partno, description, \
 assembly, model \
FROM \
 Catalog;
 sql_group_column = assembly
 sql_group_column = model
 # document info query
 # ONLY used by search utility to display document information
 # MUST be able to fetch document info by its id, therefore
 # MUST contain '$id' macro
 #
 sql_query_info = SELECT * FROM Inventory WHERE id=$id
}
index catalog
{
 source = catalog
 path = /var/data/sphinx/catalog
 morphology = stem_en
 min_word_len = 3
 min_prefix_len = 0
 min_infix_len = 3
}
searchd
{
 port = 3312
 log = /var/log/searchd/searchd.log
 query_log = /var/log/searchd/query.log
 pid_file = /var/log/searchd/searchd.pid
}

底部的 searchd 局部将设置装备摆设 searchd 守护法式自己。该局部中的条目不言自明。query.log 尤其有效:它将在运转时显示每次搜刮并显示了局,例如搜刮的文档数和婚配总数。
构建和测试索引
您如今已筹办好为 Body Parts 使用法式构建索引。为此,需求履行以下步调:
键入 $ sudo mkdir -p /var/data/sphinx 创立目次布局 /var/data/sphinx
假定 MySQL 正在运转,利用以下所示的代码运转索引器来创立索引。
清单 10. 创立索引
以下为援用的内容:
$ sudo /usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --all
Sphinx 0.9.7
Copyright (c) 2001-2007, Andrew Aksyonoff
using config file '/usr/local/etc/sphinx.conf'...
indexing index 'catalog'...
collected 8 docs, 0.0 MB
sorted 0.0 Mhits, 82.8% done
total 8 docs, 149 bytes
total 0.010 sec, 14900.00 bytes/sec, 800.00 docs/sec

注:-all 参数将重构 sphinx.conf 中列出的一切索引。假如不需求重构一切索引,您可使用其他参数只对局部索引停止重构。
您如今可使用以下所示的代码用 search 适用法式测试索引(不用运转 searchd 便可利用 search)。
清单 11. 用 search 测试索引
以下为援用的内容:
$ /usr/local/bin/search --config /usr/local/etc/sphinx.conf ENG
Sphinx 0.9.7
Copyright (c) 2001-2007, Andrew Aksyonoff
index 'catalog': query 'ENG ': returned 2 matches of 2 total in 0.000 sec
displaying matches:
1. document=8, weight=1, assembly=5, model=7
id=8
partno=ENG088
description=Cylinder head
price=55
2. document=9, weight=1, assembly=5, model=3
id=9
partno=ENG976
description=Large cylinder head
price=65
words:
1. 'eng': 2 documents, 2 hits
$ /usr/local/bin/search --config /usr/local/etc/sphinx.conf wind
Sphinx 0.9.7
Copyright (c) 2001-2007, Andrew Aksyonoff
index 'catalog': query 'wind ': returned 2 matches of 2 total in 0.000 sec
displaying matches:
1. document=1, weight=1, assembly=3, model=1
id=1
partno=WIN408
description=Portal window
price=423
2. document=5, weight=1, assembly=3, model=1
id=5
partno=WIN958
description=Windshield, front
price=500
words:
1. 'wind': 2 documents, 2 hits
$ /usr/local/bin/search \
--config /usr/local/etc/sphinx.conf --filter model 3 ENG
Sphinx 0.9.7
Copyright (c) 2001-2007, Andrew Aksyonoff
index 'catalog': query 'ENG ': returned 1 matches of 1 total in 0.000 sec
displaying matches:
1. document=9, weight=1, assembly=5, model=3
id=9
partno=ENG976
description=Large cylinder head
price=65
words:
1. 'eng': 2 documents, 2 hits

第一条号令 /usr/local/bin/search --config /usr/local/etc/sphinx.conf ENG 在零件号中找到了两个含有 ENG 的了局。第二条号令 /usr/local/bin/search --config /usr/local/etc/sphinx.conf wind 在两个零件描写中找到了子字符串 wind。而第三条号令把了局限制为 model 为 3 的条目。
编写代码
最初,您可以编写 PHP 代码来挪用 Sphinx 搜刮引擎。Sphinx PHP API 十分小而且易于把握。清单 12 是一个小型 PHP 使用法式,用于挪用 searchd 以失掉利用下面所示的最初一条号令失掉的不异了局(“在属于型号 3 的称号中找到含有 ‘cylinder’ 的一切零件”)。
清单 12. 从 PHP 挪用 Sphinx 搜刮引擎
以下为援用的内容:
<?php
include('sphinx-0.9.7/api/sphinxapi.php');
$cl = new SphinxClient();
$cl->SetServer( "localhost", 3312 );
$cl->SetMatchMode( SPH_MATCH_ANY );
$cl->SetFilter( 'model', array( 3 ) );
$result = $cl->Query( 'cylinder', 'catalog' );
if ( $result === false ) {
 echo "Query failed: " . $cl->GetLastError() . ".\n";
}
else {
 if ( $cl->GetLastWarning() ) {
  echo "WARNING: " . $cl->GetLastWarning() . "";
 }
 if ( ! empty($result["matches"]) ) {
  foreach ( $result["matches"] as $doc => $docinfo ) {
   echo "$doc\n";
  }
  print_r( $result );
 }
}
exit;
?>

要测试代码,需求为 Sphinx 创立 log 目次,启动 searchd,然后运转 PHP 使用法式,以下所示:
清单 13. PHP 使用法式
以下为援用的内容:
$ sudo mkdir -p /var/log/searchd
$ sudo /usr/local/bin/searchd --config /usr/local/etc/sphinx.conf
$ php search.php
9
Array (
[fields] => Array (
 [0] => partno
 [1] => description
)
[attrs] => Array(
 [assembly] => 1
 [model] => 1
)
[matches] => Array(
 [9] => Array(
  [weight] => 1
  [attrs] => Array(
   [assembly] => 5
   [model] => 3
  )
 )
)
[total] => 1
[total_found] => 1
[time] => 0.000
[words] => Array(
 [cylind] => Array(
  [docs] => 2
  [hits] => 2
 )
)
)

输入为 9:婚配的单行的准确主键。假如 Sphinx 找到婚配,相干数组 $result 将包括名为 results 的元素。阅读 print_r() 的输入以检查前往的其他内容。
注重事项:total_found 是在索引中找到的婚配总数,而 found 是前往的了局数。这二者能够分歧,由于您可以更改每次前往几何个婚配了局和要前往哪批婚配了局,哪一个了局利于对冗杂的了局列表分页。请检查 API 挪用 SetLimits()。一个分页示例是用 $cl->SetLimits( ( $page - 1 ) * SPAN, SPAN ) 挪用搜刮引擎前往第一批、第二批、第三批(依此类推)SPAN 婚配了局,这取决于显示哪一个页面。
停止语
Sphinx 还有更多的功效可以使用。我在这里仅仅引见了最浅易的一局部,然而您如今有一个可以任务的实际示例作为基石来扩大您的妙技。
细心研读随刊行版附带的样例 Sphinx 设置装备摆设文件 /usr/local/etc/sphinx.conf.dist。该文件中的正文将申明每一个 Sphinx 参数可以完成的功效;展现若何创立散布式冗余设置装备摆设;并申明若何承继根基设置以免源代码及索引中的反复。Sphinx README 文件仍是非常丰厚的信息源,包含若何将 Sphinx 直接嵌入 MySQL V5 —— 不需求利用守护法式。

exit来实现结束后面的PHP语句的执行,缩小调试范围,特别是数据库交互的程序,先输出个SQL语句看看,对了,再分析怎么会插入/删除不成功呢?这样对查错很有帮助。
作者: 若相依    时间: 2015-2-4 06:44
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者: 爱飞    时间: 2015-2-9 17:51
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 简单生活    时间: 2015-2-12 22:48
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 飘飘悠悠    时间: 2015-2-26 20:37
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者: 柔情似水    时间: 2015-3-9 10:23
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 蒙在股里    时间: 2015-3-16 03:30
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者: 若天明    时间: 2015-3-22 19:10
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者: 金色的骷髅    时间: 2015-3-22 19:10
首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。
作者: 谁可相欹    时间: 2015-3-25 21:48
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 愤怒的大鸟    时间: 2015-4-13 00:11
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 乐观    时间: 2015-4-21 18:50
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 冷月葬花魂    时间: 2015-4-24 10:14
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 再现理想    时间: 2015-5-5 04:59
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者: 透明    时间: 2015-5-8 10:55
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 变相怪杰    时间: 2015-6-4 03:03
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 第二个灵魂    时间: 2015-6-6 18:39
Ps:以上纯属原创,如有雷同,纯属巧合
作者: 再见西城    时间: 2015-6-9 19:58
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
作者: 兰色精灵    时间: 2015-6-16 20:02
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 活着的死人    时间: 2015-6-24 13:25
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2