欧美三区四区_av先锋影音资源站_亚洲第一论坛sis_影音先锋2020色资源网_亚洲精品社区_在线免费观看av网站_国产一区二区伦理_亚洲欧美视频一区二区_99视频精品全部免费在线_精精国产xxxx视频在线

用 PHP 構建自定義搜索引擎_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:PHP連接遠程MYSQL和MYSQL5.1中文亂碼處理方法
本文描述了我在開發我的Blog的過程中所遇到的一些問題以及解決他們的方法。因為本網站采用的是一個免費的遠程MySql數據庫db4free.net,而且這個數據庫是5.1的版本,所以在開發過程中出現了許多問

雖然 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 —— 不需要使用守護程序。

分享:PHP實例:email address 生成圖片程序
把下面的文件保存為index.php 以下為引用的內容: <? /* MailX Managment System 0.8 Beta */ header("Content-type:image/png&

來源:模板無憂//所屬分類:PHP教程/更新時間:2008-08-22
相關PHP教程
亚洲国产无线乱码在线观看 | 人与嘼交av免费| 五月色婷婷综合| 奇米777欧美一区二区| 欧美三级一区二区| 99re在线观看| 国产精品成人一区二区三区电影毛片 | 黄色免费网址大全| 性生活免费网站| 久久久久久一区二区| 欧美精品第1页| 国产欧美日韩一区| 99精品全国免费观看| 午夜日韩影院| 久久久久久久一区| 伊人久久噜噜噜躁狠狠躁| 捆绑紧缚一区二区三区视频| 精品国产一区二区三区av性色| 免费国产一区二区| 亚洲成人生活片| 精品大片一区二区| 亚洲在线观看免费| 国产精品一香蕉国产线看观看| 曰本三级日本三级日本三级| 澳门av一区二区三区| 国产精品18久久久| 这里只有精品视频在线| 久操网在线观看| 91福利免费视频| 欧美一级网站| 精品少妇一区二区三区日产乱码 | 都市激情综合| 国产成人av一区二区三区在线 | 秋霞毛片久久久久久久久| 天天综合天天做| 波多野结衣在线播放一区| 亚洲国产你懂的| 亚洲一区二区三区四区在线播放 | 日韩av网站大全| www.激情网| 亚洲手机在线观看| 日本在线不卡视频一二三区| 亚洲乱码国产乱码精品精| 久久在线中文字幕| 99热这里只有精品在线观看| 精品一区二区成人精品| 中文字幕日韩精品有码视频| 干日本少妇首页| 亚洲欧洲成人在线| 99re这里只有精品视频首页| 欧美激情精品久久久久| 奇米777在线视频| 精品视频在线观看免费观看| 自拍视频在线观看一区二区| 国产日韩欧美电影在线观看| 国产精品1区2区3区4区| 日韩视频在线观看| 欧美视频一区二区三区四区 | 国产黄色激情视频| 亚洲va欧美va| 国产 日韩 欧美大片| 久久99国产精品久久久久久久久| 日韩a一级欧美一级| 青青青国产精品| 成人欧美一区二区三区白人| 91精品在线看| 一级黄色录像视频| 国产精品国码视频| 亚洲国产成人精品电影| 麻豆tv在线播放| 天堂在线资源库| 久久久欧美精品sm网站| 国产精品av在线播放| 久久久视频6r| 99久久久久国产精品| 欧美精品777| 国产xxxx振车| 不卡福利视频| 国产精品久99| 18成人在线| 日韩三级一区二区三区| 免费亚洲一区| 视频在线观看99| 无码人妻少妇色欲av一区二区| 51vv免费精品视频一区二区| 天天综合色天天综合色h| 欧美资源一区| 99热这里只有精品5| 91视视频在线直接观看在线看网页在线看| 欧美亚洲另类制服自拍| 国产视频123区| 影音先锋久久| 国产亚洲综合久久| 黄色一级片免费播放| 精品国产一区二区三区不卡蜜臂| 色婷婷激情综合| 特级毛片在线免费观看| 免费观看a视频| 中文字幕国产一区| 成人黄色在线免费观看| 波多野结衣一区二区三区在线 | 精品少妇一区二区30p| 800av在线播放| 999国产精品永久免费视频app| 精品美女在线观看| 一区二区三区免费播放| 中文在线综合| 欧美在线999| 人人妻人人澡人人爽欧美一区| 婷婷激情一区| 一个色综合av| 亚洲无玛一区| 少妇喷水在线观看| 亚洲色图在线看| 欧美日韩精品不卡| 亚洲精品久久久久久久久久久久久久 | 欧美人妇做爰xxxⅹ性高电影| 91免费黄视频| 白嫩亚洲一区二区三区| 欧美日韩激情视频8区| youjizz.com亚洲| 人人视频精品| 亚洲国产精品久久不卡毛片| 亚洲国产精品久久久久婷婷老年| 欧洲av在线播放| 亚洲美腿欧美偷拍| 欧美少妇一区| 日韩中文字幕免费观看| 亚洲日本乱码在线观看| 日本高清不卡三区| 色一情一乱一区二区三区| 亚洲欧美激情视频在线观看一区二区三区| 麻豆av一区二区三区| a级片免费观看| 国产精品美女久久久久久久久 | 亚洲国产不卡| 正在播放亚洲1区| 老司机福利av| 国产欧美午夜| 久久久久久97| 久久久国产精品黄毛片| 久久电影网站中文字幕| 国产精品扒开腿做爽爽爽男男 | 成人精品视频一区二区| 欧美一区二区三区久久| 欧美成人免费网站| 一起草最新网址| 亚洲区综合中文字幕日日| 最近2019年好看中文字幕视频| 国产夫妻性爱视频| 亚洲视频大全| 欧美影院久久久| 天天做天天爱夜夜爽| 91蜜桃网址入口| 精品在线视频一区二区| 日韩有码第一页| 婷婷开心激情综合| 欧美三级一级片| 国产99精品| 亚洲欧美日韩天堂| 欧美性猛交xxxx乱| 美女视频黄a大片欧美| 国产精品视频午夜| 一区二区三区亚洲视频| 亚洲图片欧美激情| 狠狠精品干练久久久无码中文字幕 | 午夜精品久久久久久久爽| 伊人色综合久久天天人手人婷| 亚洲激情免费视频| 激情小说一区| 亚洲欧洲在线看| 国产7777777| 久久99热狠狠色一区二区| 91欧美精品午夜性色福利在线| 国产美女免费看| 亚洲一区二区av在线| 91成人在线观看喷潮教学| 中文字幕精品影院| 日韩中文理论片| 永久久久久久久| 成人精品免费网站| 免费国产一区二区| 在线高清欧美| 欧美本精品男人aⅴ天堂| 国产高潮视频在线观看| 久久av一区二区三区| 国产精品视频区1| 成人激情四射网| 欧美日韩中文字幕综合视频| 亚洲男人天堂色| 一级欧洲+日本+国产 | 91精品国产综合久久久久久久久 | 成人中心免费视频| 可以免费观看的毛片| 在线观看视频一区| 手机精品视频在线| 国产精品主播| 国产日产久久高清欧美一区| 丁香花免费高清完整在线播放| 欧美性xxxxx极品娇小| 午夜国产福利在线观看| 99riav国产精品| 国产在线拍偷自揄拍精品| 亚洲成a人片77777精品| 在线一区二区观看| 18深夜在线观看免费视频| 天堂成人免费av电影一区| 91精品在线观| 日本另类视频| 亚洲电影第1页| 美女网站视频色| 99精品欧美一区二区蜜桃免费| 手机成人av在线| 亚洲欧洲免费| 欧美国产日韩视频| 中文字幕欧美在线观看| 亚洲成av人片一区二区| 少妇一级淫免费播放| 亚洲美女黄色| 91亚洲午夜在线| 欧美日韩在线精品一区二区三区激情综合 | 国产精品xxx视频| 亚洲精品国产一区二| 欧美日韩激情一区二区| 在线免费观看日韩av| 国产91精品免费| japanese在线视频| 成人嘿咻视频免费看| 国外成人免费在线播放 | 国产丝袜一区视频在线观看 | 欧美成人精品在线| 国产精品无码一区| 91久久精品一区二区三| 久久人人爽人人爽人人片| 国产ts人妖一区二区| 亚洲av综合色区| 99久久www免费| 国产成人精品综合| 伊伊综合在线| 日韩电影中文字幕在线| 久草免费在线视频观看| 亚洲人亚洲人成电影网站色| 尤物国产在线观看| 免费人成黄页网站在线一区二区| 欧美日韩精品一区| 国产免费av一区二区三区| 国产91精品久| 电影网一区二区| 亚洲精选在线观看| 日韩精品一区二区亚洲av| 欧美午夜宅男影院在线观看| 国产精品无码电影| 91麻豆精品视频| 欧美视频第三页| 视频一区免费在线观看| 亚洲激情图片| 欧美电影一区| 91精品国产综合久久香蕉922| 欧美videos粗暴| 久久人人爽人人爽爽久久| 国产精品毛片一区视频播| 欧美高清你懂得| 欧美一区免费观看| 亚洲综合成人在线视频| 欧美xxxxx精品| 91麻豆免费看片| 激情网站五月天| 美女诱惑一区二区| 一级黄色录像免费看| 国内在线观看一区二区三区| 国产精品美女黄网| 亚洲最好看的视频| 国产精品无码专区在线观看| 91麻豆精品| 欧美激情按摩在线| 欧美电影免费看| 自拍偷拍亚洲精品| 国产99视频在线| 精品小视频在线| 一级黄色免费看| 亚洲精品一区二区三区在线观看| 日韩毛片一区二区三区| 欧美日韩免费一区二区三区| 九九精品视频免费| 精品国产乱码久久久久久天美| 国产美女精品久久| 亚洲日本欧美天堂| 欧美 变态 另类 人妖| 国产精品欧美一区二区三区| 无码人妻aⅴ一区二区三区玉蒲团| 26uuu国产在线精品一区二区| 亚洲黄色av网址| 国产999精品久久久久久绿帽| 亚洲熟妇国产熟妇肥婆| 久久精品国产精品亚洲精品| 日韩精品一区二区三区四| 欧美亚洲三级| 五月天在线免费视频| 性欧美xxxx大乳国产app| 色乱码一区二区三区熟女| 国产精品亚洲欧美| 中文字幕乱码免费| 奇米影视一区二区三区| 成人免费播放器| 捆绑紧缚一区二区三区视频| 国产一级爱c视频| 国产资源在线一区| 国产综合av在线| 国产精一区二区三区| 亚洲成熟丰满熟妇高潮xxxxx| 国产91在线看| 亚洲国产成人va在线观看麻豆| av电影天堂一区二区在线| 超碰成人在线播放| 91丝袜高跟美女视频| 亚欧精品在线视频| 欧美极品另类videosde| 毛茸茸free性熟hd| 亚洲欧美另类图片小说| 国产伦精品一区二区三区视频女| 午夜视频在线观看一区二区| 强制高潮抽搐sm调教高h| 一本大道久久a久久精品综合| 久操视频免费在线观看| 欧美精品久久一区| 伊人久久久久久久久久久久 | 国产原创精品| 欧美一区二区| 亚洲精品日韩成人| 日韩成人一区二区三区在线观看| 精品国产av无码一区二区三区| 国产精品一区二区久久精品爱涩| 污片在线免费看| 中文字幕国产一区| 一级黄色性视频| 日韩欧美aaa| 亚洲天堂av片| 精品视频中文字幕| 91av亚洲| 庆余年2免费日韩剧观看大牛| 久久国产精品色av免费看| 97netav| 午夜精品免费| 日韩成人午夜影院| 国产高清在线精品| 中文字幕第六页| 一级做a爱片久久| 欧美黑人精品一区二区不卡| 制服丝袜亚洲网站| 国产乱人乱偷精品视频a人人澡| 日韩小视频网址| 婷婷久久免费视频| 92国产精品视频| 国内精品美女在线观看| 国产毛片久久久久久国产毛片| 国产精品888| 亚洲精品久久一区二区三区777| 一区二区三区欧美久久| 精品无码久久久久久久久| 精品国产乱码久久久久久影片| 欧美性猛交 xxxx| 97免费中文视频在线观看| 亚洲制服欧美另类| 香蕉久久夜色| 国产在线精品免费| 欧洲熟妇的性久久久久久| 疯狂做受xxxx欧美肥白少妇 | 91精品国产91综合久久蜜臀| 国产探花在线观看视频| 久久国产精品免费一区二区三区| 国产精品美女av| 亚洲91久久| 免费特级黄色片| 久久综合精品国产一区二区三区| 国产精品免费无码| 正在播放亚洲一区| 亚洲精品免费在线观看视频| 2020久久国产精品| 成人无号精品一区二区三区| 在线观看日韩片| 成人午夜碰碰视频| xxx在线播放| 这里只有精品99re| 免费观看国产视频| 国产精品久久久av久久久| 一本一道久久a久久精品蜜桃| 欧美,日韩,国产在线| 欧美国产精品专区| 久久机热这里只有精品| 亚洲欧美精品一区| 成人污污www网站免费丝瓜| 国产精品污www一区二区三区| 久久精品系列| 绯色av蜜臀vs少妇| 在线一区二区三区四区五区| 国内精品偷拍视频| 国产精国产精品| 欧美在线三级| 久久午夜夜伦鲁鲁一区二区| 亚洲一区在线观看网站|