使用PHP+Sphinx建立高效的站内搜索引擎
1.??? 為什么要使用Sphinx
?
假設(shè)你現(xiàn)在運(yùn)營著一個(gè)論壇,論壇數(shù)據(jù)已經(jīng)超過100W,很多用戶都反映論壇搜索的速度非常慢,那么這時(shí)你就可以考慮使用Sphinx了(當(dāng)然其他的全文檢索程序或方法也行)。
?
2.??? Sphinx是什么
?
Sphinx由俄羅斯人Andrew Aksyonoff 開發(fā)的高性能全文搜索軟件包,在GPL與商業(yè)協(xié)議雙許可協(xié)議下發(fā)行。
全文檢索是指以文檔的全部文本信息作為檢索對象的一種信息檢索技術(shù)。檢索的對象有可能是文章的標(biāo)題,也有可能是文章的作者,也有可能是文章摘要或內(nèi)容。
?
3.??? Sphinx的特性
?
l? 高速索引 (在新款CPU上,近10 MB/秒);
l? 高速搜索 (2-4G的文本量中平均查詢速度不到0.1秒);
l? 高可用性 (單CPU上最大可支持100 GB的文本,100M文檔);
l? 提供良好的相關(guān)性排名
l? 支持分布式搜索;
l? 提供文檔摘要生成;
l? 提供從MySQL內(nèi)部的插件式存儲引擎上搜索
l? 支持布爾,短語, 和近義詞查詢;
l? 支持每個(gè)文檔多個(gè)全文檢索域(默認(rèn)最大32個(gè));
l? 支持每個(gè)文檔多屬性;
l? 支持?jǐn)嘣~;
l? 支持單字節(jié)編碼與UTF-8編碼;
?
4.??? 下載并安裝Sphinx
?
打開網(wǎng)址http://www.coreseek.cn/news/7/52/ 找到適合自己的操作系統(tǒng)的版本,比如我是Windows那么我就可以下載Coreseek Win32通用版本,Linux下可以下載源碼包,自己編譯安裝。這里解釋下為什么我們下載的程序叫Coreseek,Coreseek是基于Sphinx開發(fā)的一款軟件,對Sphinx做了一些改動,在中文方面支持得比Sphinx好,所以我們使用之。
下載完成后,將程序解壓到你想解壓的地方,比如我就想解壓到E盤根目錄,之后修改目錄名為Coreseek,大功告成Coreseek安裝完成了,安裝的目錄是在E:\coreseek\。
?
5.??? 使用Sphinx
?
我要使用Sphinx需要做以下幾件事
1)??????? 首先得有數(shù)據(jù)
2)??????? 建立Sphinx配置文件
3)??????? 生成索引
4)??????? 啟動Sphinx
5)??????? 使用之(調(diào)用api或search.exe程序進(jìn)行查詢)
?
第1件:(導(dǎo)入數(shù)據(jù))
我們建立測試所需要用到得數(shù)據(jù)庫、表以及數(shù)據(jù),篇幅有限,這些在附件中都有,下載后導(dǎo)入MySQL即可。
?
第2件:(建立配置文件)
接下來我們需要建立一個(gè)Sphinx的配置文件 E:\coreseek\etc\mysql.conf,將其內(nèi)容改為下面這些:
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
}
?
先講下這個(gè)配置文件中每項(xiàng)的含義。
source mysql{} 定義源名稱為mysql,也可以叫其他的,比如:source xxx{}
type? 數(shù)據(jù)源類型
sql_* 數(shù)據(jù)相關(guān)的配置,比如sql_host,sql_pass什么的,這些不解釋鳥
sql_query 建立索引時(shí)的查詢命令,在這里盡可能不使用where或group by,將where與groupby的內(nèi)容交給sphinx,由sphinx進(jìn)行條件過濾與groupby效率會更高,注意:select 的字段必須包括一個(gè)唯一主鍵以及要全文檢索的字段,where中要用到的字段也要select出來
sql_query_pre 在執(zhí)行sql_query前執(zhí)行的sql命令, 可以有多條
sql_attr 以這個(gè)開頭的配置項(xiàng),表示屬性字段,在where,orderby,groupby中出現(xiàn)的字段要分別定義一個(gè)屬性,定義不同類型的字段要用不同的屬性名,比如上面的sql_attr_timestamp就是時(shí)間戳類型。
?
index mysql{} 定義索引名稱為mysql,也可以叫其他的,比如:index xxx{}
source 關(guān)聯(lián)源,就是source xxx定義的。
path 索引文件存放路徑,比如:E:/coreseek/var/data/mysql 實(shí)際存放在E:/coreseek/var/data/目錄,然后創(chuàng)建多個(gè)名稱為mysql后綴卻不同的索引文件
charset_dictpath? 指明分詞法讀取詞典文件的位置,當(dāng)啟用分詞法時(shí),為必填項(xiàng)。在使用LibMMSeg作為分詞 庫時(shí),需要確保詞典文件uni.lib在指定的目錄下
charset_type 字符集,比如charset_type = zh_cn.gbk
?
searchd{} sphinx守護(hù)進(jìn)程配置
listen 監(jiān)聽端口
max_matches最大匹配數(shù),也就是查找的數(shù)據(jù)再多也只返回這里設(shè)置的1000條
pid_file pid文件路徑
log全文檢索日志
query_log查詢?nèi)罩?/p>
?
好了,配置文件就這樣,配置的參數(shù)還有很多,大家可以自己查文檔。
?
第3件:(生成索引)
開始 -> 運(yùn)行 -> 輸入cmd回車,打開命令行工具
e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf --all
這一串東西其實(shí)就是調(diào)用indexer程序來生成所有索引
?
如果只想對某個(gè)數(shù)據(jù)源進(jìn)行索引,則可以這樣:e:\coreseek\bin\indexer --config e:\coreseek\etc\mysql.conf 索引名稱(索引名稱指配置文件中所定義的)
--config,--all這些都是indexer程序的參數(shù),想了解更多參數(shù)的朋友可以查看文檔
運(yùn)行命令后如果你沒看到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
運(yùn)行后提示了一大堆東西
using config file 'e:\coreseek\etc\mysql.conf'...
listening on all interfaces, port=9312
accepting connections
不用管這些鳥文是啥意思,反正Sphinx是啟動好了。
現(xiàn)在有一串鳥文的這個(gè)命令行是不能關(guān)的,因?yàn)殛P(guān)了Sphinx也就關(guān)了,如果覺得這樣不爽,可以將Sphinx安裝成系統(tǒng)服務(wù),在后臺運(yùn)行。
安裝系統(tǒng)服務(wù)只需在命令行中輸入以下命令
e:\coreseek\bin\searchd --config e:\coreseek\etc\mysql.conf --install
安裝之后記得啟動這個(gè)服務(wù),不會啟動那我沒法,自己google。
?
第5步:(使用Sphinx)
在web根目錄下建立一個(gè)search目錄(當(dāng)然不在根目錄也行,同樣目錄名也可以隨取),復(fù)制E:\coreseek\api\ sphinxapi.php文件到search目錄(sphinxapi.php這個(gè)是sphinx官方提供的api),開始php程序的編寫。
在search目錄建立一個(gè)文件,名字叫啥都行,我管它叫index.php,其內(nèi)容如下
<?php
?
include 'sphinxapi.php';? // 加載Sphinx API
?
$sc = new SphinxClient(); // 實(shí)例化Api
$sc->setServer('localhost', 9312); // 設(shè)置服務(wù)端,第一個(gè)參數(shù)sphinx服務(wù)器地址,第二個(gè)sphinx監(jiān)聽端口
$res = $sc->query('sphinx', 'mysql'); // 執(zhí)行查詢,第一個(gè)參數(shù)查詢的關(guān)鍵字,第二個(gè)查詢的索引名稱,mysql索引名稱(這個(gè)也是在配置文件中定義的),多個(gè)索引名稱以,分開,也可以用*表示所有索引。
print_r($res);
?
打印結(jié)果:
Array
(
?? ………省略………
??? [matches] => Array
??????? (
??????????? [2] => Array
??????????????? (
??????????????????? [weight] => 2
??????????????????? [attrs] => Array
??????????????????????? (
??????????????????????????? [addtime] => 1282622004
??????????????????????? )
??????????????? )
??????????? [4] => Array
??????????????? (
??????????????????? [weight] => 2
??????????????????? [attrs] => Array
??????????????????????? (
??????????????????????????? [addtime] => 1282622079
??????????????????????? )
??????????????? )
??????? )
? ………省略………
)
Matches中就是查詢的結(jié)果了,但是仿佛不是我們想要的數(shù)據(jù),比如titile,content字段的內(nèi)容就沒有查詢出來,根據(jù)官方的說明是Sphinx并沒有連接到MySQL去取數(shù)據(jù),只是根據(jù)它自己的索引內(nèi)容進(jìn)行計(jì)算,因此如果想用Sphinx提供的API去取得我們想要的數(shù)據(jù),還必須以查詢的結(jié)果為依據(jù),再次查詢MySQL從而得到我們想要的數(shù)據(jù)。
?
查詢結(jié)果中鍵值分別表示
另類方式實(shí)現(xiàn)PHP后臺運(yùn)行
總結(jié)
以上是生活随笔為你收集整理的使用PHP+Sphinx建立高效的站内搜索引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯极光盒子2S好用吗?有人知道吗?
- 下一篇: PHP 符号大全