PHP全文索引 訊搜xunsearch

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();
	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章