使用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的文檔

當你有事情忙的時候,你會以爲時間過得很快 很快。可能你會感受有點累。但這是一我的成功的歷程。請堅信,我必定會好好的。
更多

相關文章
相關標籤/搜索