PHP實現全文索引,使用訊搜(官方網站http://www.xunsearch.com/)
1.安裝
目前訊搜只能安裝在linux系統,官方安裝文檔:http://www.xunsearch.com/doc/php/guide/start.installation
安裝步驟:
# 下載安裝包
wget http://www.xunsearch.com/download/xunsearch-full-latest.tar.bz2
# 解壓 如果報錯tar (child): lbzip2: Cannot exec: No such file or directory 則安裝bzip2,執行命令: yum -y install bzip2
tar -xjf xunsearch-full-latest.tar.bz2
# 安裝
cd xunsearch-full-1.3.0/
sh setup.sh
# 中途需要輸入安裝路徑,我這邊的安裝路徑是 /opt/www/xunsearch,記得先創建好路徑
# 安裝完成會提示啓動命令,其實就是安裝路徑下bin/xs-ctl.sh restart
# 啓動服務
/opt/www/xunsearch/bin/xs-ctl.sh restart
啓動完成後可以輸入命令查看服務的運行狀態: ps -ef | grep xs-searchd
安裝完成
2.PHP使用訊搜
首先創建數據庫配置文件,官方建議我們數據庫配置文件都統一放在安裝路徑下/sdk/php/apk/下,我這邊創建一個新聞數據庫:
/opt/www/xunsearch/sdk/php/apk/news.ini
內容如下:
project.name = news
project.default_charset = utf-8
server.index = 8383
server.search = 8384
[pid]
type = id
[subject]
type = title
[message]
type = body
[chrono]
type = numeric
代碼中調用訊搜的邏輯是:
(1)新增索引
(2)搜索
代碼中調用訊搜必須引入/opt/www/xunsearch/sdk/php/lib/XS.php,下面是新增索引的代碼例子:
<?php
require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
try{
$xs = new XS('/opt/www/xunsearch/sdk/php/apk/news.ini');
$index = $xs->index;
$doc = new XSDocument;
// 添加文章1的索引
$doc->setFields(array(
'pid' => 1, // 唯一ID
'subject' => '炸帶魚時,拍麪粉還是澱粉?原來很多人都做錯了,這纔是正確方法', // 文章標題
'message' => '', // 內容 因爲我這邊只希望根據標題搜索,所以內容爲空
'chrono' => time() // 設置這個值後面排序用到
));
$index->add($doc);
// 添加文章2的索引
$doc->setFields(array(
'pid' => 2,
'subject' => '戒菸那麼難,爲什麼還是勸你試?這些好處一個月就能體現',
'message' => '',
'chrono' => time()
));
$index->add($doc);
}catch(XSException $e) {
print_r($e);
}
搜索代碼例子:
<?php
require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
try{
$xs = new XS('/opt/www/xunsearch/sdk/php/apk/news.ini');
// setFuzzy 開啓模糊搜索,讓搜索結果更加廣泛
// setSort('chrono') 設置排序爲chrono值倒序
// setLimit(10, 5) 獲取結果最大10條,從第5條開始
// search('世界') 搜索關鍵詞
$docs = $xs->search->setFuzzy()->setSort('chrono')->setLimit(10, 5)->search('世界');
}catch(XSException $e) {
print_r($e);
}
獲取分詞代碼例子:
<?php
require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
try{
$xs = new XS('/opt/www/xunsearch/sdk/php/apk/news.ini');
$xs_token = new XSTokenizerScws();
return $xs_token->getResult('炸帶魚時,拍麪粉還是澱粉?原來很多人都做錯了,這纔是正確方法');
}catch(XSException $e) {
print_r($e);
}
更多的功能參考官方文檔http://www.xunsearch.com/doc/php/guide/start.overview , http://www.xunsearch.com/doc/php/api
下面是實際開發應用整理的使用訊搜的工具類:
<?php
require_once '/opt/www/xunsearch/sdk/php/lib/XS.php';
class MyXS {
protected $xs;
protected $xs_doc;
protected $xs_token;
function __construct() {
$this->xs = new XS(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'news.ini');
$this->xs_doc = new XSDocument;
$this->xs_token = new XSTokenizerScws;
}
/* 添加索引 */
public function addIndex($pid, $subject, $chrono = null) {
$this->xs_doc->setFields(array(
'pid' => $pid,
'subject' => $subject,
'message' => '',
'chrono' => empty($chrono) ? time() : $chrono
));
$this->xs->index->add($this->xs_doc);
}
/* 搜索 */
public function search($key, $step = 20, $start = 0) {
$docs = $this->xs->search->setFuzzy()->setSort('chrono')->setLimit($step, $start)->search($key);
$result = array();
foreach ($docs as $key => $value) {
$result[$value['pid']] = $value['subject'];
}
return $result;
}
/* 分詞 */
public function getToken($str) {
$result = $this->xs_token->getResult($str);
$token = array();
foreach ($result as $key => $value) {
$token[] = $value['word'];
}
return $token;
}
/* 清空索引 */
public function clearIndex() {
$this->xs->index->clean();
}
}