WordPress 的預設搜尋是採用 mysql 的 like,但是當我們整個網站的資料非常大的時候,mysql 的 like 的效率將會非常慢,而且 WordPress 本身的效能也是比較低的,而且 mysql like 的準確率也不高,前一段時間本站使用了 WordPress 整合 Google 自定義搜尋但是發現 Google 經常被牆,很不爽,決定改之。今天 WordPress 教程網跟大家分享下如何在 WordPress 中使用高效的全文索引元件 coreseek 。 Coreseek 開源中文檢索引擎,可以說是 Sphinx 中文版,因為 coreseek 加入了中文分詞庫,大家可以到官網去檢視具體介紹:http://www.coreseek.cn/。如果你的 WordPress 系統搜尋要採用 coreseek,首先你得擁有自己的伺服器 (VPS), 如果你只是 ftp 空間那是沒有辦法的。本站已成功部署,你可以在本站搜尋中檢視例項。下面就讓我們一步步來部署吧。
安裝 coreseek
coreseek 的安裝建議直接檢視官網的安裝方法, 如果 linux 系統可以直接檢視:http://www.coreseek.cn/products-install/install_on_bsd_linux/, 其他系統可以檢視:http://www.coreseek.cn/products-install/#doc_cn,本站給出我的配置檔案 etc/csft.conf,配置資訊如下:
#MySQL 資料來源配置,詳情請檢視:http://www.coreseek.cn/products-install/mysql/
#配置來著 WordPress 教程網 (http://www.wpnoob.cn)
#請先將 var/test/documents.sql 匯入資料庫,並配置好以下的 MySQL 使用者密碼資料庫
#源定義
source mysql
{
type = mysql
#mysql 資料配置
sql_host = localhost
sql_user = root #mysql 使用者名稱
sql_pass = #mysql 密碼
sql_db = wpux
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT ID, UNIX_TIMESTAMP(post_date) AS date_added, post_content, post_title FROM wp_posts
#對 wp_posts 表建立全文索引
#sql_query 第一列 id 需為整數
#post_title,post_content 兩個欄位被全文索引
#sql_attr_uint = ID #從 SQL 讀取到的值必須為整數
sql_attr_timestamp = date_added #從 SQL 讀取到的值必須為整數,作為時間屬性
sql_query_info_pre = SET NAMES utf8 #命令列查詢時,設定正確的字元集
sql_query_info = SELECT * FROM wp_posts WHERE ID=$ID #命令列查詢時,從資料庫讀取原始資料資訊
}
#index 定義
index mysql
{
source = mysql #對應的 source 名稱
path = var/data/mysql #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分詞配置,詳情請檢視:http://www.coreseek.cn/products-install/coreseek_mmseg/
charset_dictpath = /usr/local/mmseg3/etc/ #BSD 、 Linux 環境下設定,/符號結尾
#charset_dictpath = etc/ #Windows 環境下設定,/符號結尾,最好給出絕對路徑,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#全域性 index 定義
indexer
{
mem_limit = 64M #記憶體設定
}
#searchd 服務定義
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = var/log/searchd_mysql.pid #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
log = var/log/searchd_mysql.log #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
query_log = var/log/query_mysql.log #請修改為實際使用的絕對路徑,例如:/usr/local/coreseek/var/...
}
你可以直接複製該程式碼到你的 coreseek 安裝目錄下的 etc/csft.conf 檔案中,以上配置你可以直接複製使用,只有 mysql 的資料庫資訊進行修改即可。
這邊提醒大家注意幾點:
1 、要先安裝賴庫。
2 、安裝支援 mysql 的資料來源,WordPress 是採用 mysql 資料庫的。
3 、常用的命令如下:
a. 開啟 coreseek 命令
/usr/local/coreseek/bin/searchd -c etc/csft.conf
以下為正常開啟搜尋服務時的提示資訊:(csft-4.0 版類似)
Coreseek Fulltext 3.2 [ Sphinx 0.9.9-release (r2117)]
Copyright (c) 2007-2010,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
using config file 『etc/csft.conf』…
listening on all interfaces, port=9312
b. 如要停止搜尋服務,請使用
/usr/local/coreseek/bin/searchd -c etc/csft.conf --stop
c. 如要已啟動服務,要更新索引,請使用
/usr/local/coreseek/bin/indexer -c etc/csft.conf --all --rotate
你可以把這個命令加到定時任務中,如
crontab -e 然後加入以下定時任務 00 03 * * * /sbin/service sshd stop #意思是每天凌晨 3:00 重建索引。
注意:如果大家資料量大的話可以採用增量索引與即時索引等,大家可以到官網去檢視手冊。
OK, 至此我們的 coreseek 已經安裝完成
WordPress 全文搜尋頁面
1 、在解壓的 coreseek 的檔案中大家可以看到有個 testpack 目錄,進入 testapck/api 我們可以看到有很多介面檔案。我們可以直接複製這個 api 目錄到我們的主題目錄下,呆會搜尋頁面將會使用到該檔案:
cd coreseek-3.2.14/testpack/api ll 我們可以看到 api 的目錄檔案如下 drwxrwxrwx 2 root root 4096 Jan 12 2011 java java 介面 drwxrwxrwx 2 root root 4096 Jan 12 2011 libsphinxclient drwxrwxrwx 5 root root 138 Jan 12 2011 ruby -rwxrwxrwx 1 root root 44399 May 7 2010 sphinxapi.php php 介面 -rwxrwxrwx 1 root root 26251 May 7 2010 sphinxapi.py -rwxrwxrwx 1 root root 1053 May 7 2010 test2.php php 測試檔案 -rwxrwxrwx 1 root root 652 May 7 2010 test2.py -rwxrwxrwx 1 root root 763 Jan 12 2011 test_coreseek.php -rwxrwxrwx 1 root root 5656 Jun 8 2010 test.php -rwxrwxrwx 1 root root 3377 May 7 2010 test.py
以下的檔案對我們有用的就是 sphinxapi.php,他是 coreseek 的 php 呼叫介面,test.php 與 test2.php 是全文索引的測試檔案,大家可以參考下,其他檔案可以刪除。將 api 目錄複製到我們的主題目錄後,我們在搜尋頁面 search.php 中全文索引的程式碼如下:
<?php
//coreseek 搜尋結果
include_once( dirname(__FILE__) . "/api/sphinxapi.php" );
$cl = new SphinxClient ();
$cl->SetServer ( '127.0.0.1', 9312);
//以下設定用於返回陣列形式的結果
$cl->SetArrayResult ( true );
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$start = ($paged - 1) * 10;
$cl->SetLimits($start,10);
$keyword = $s = isset($_GET['s']) ? htmlspecialchars(trim($_GET['s'])) : ''; //獲取搜尋詞
$res = $cl->Query ( "$keyword", "*" );
//print_r($res); //檢視全文索引結果
$total = $res['total']; //所有返回文章數,用於分頁
if(!empty($res['matches'])) {
foreach($res['matches'] as $value) {
$id_arr[] = $value['id'];
}
}
$id_str = implode(",", $id_arr);
$args = array();
$args = array(
'include' => $id_arr
);
wp_reset_query();
$sql = "select * from wp_posts where ID in($id_str) and post_type='post' AND post_status = 'publish'"; //根據 ID 讀取文章資料
$data = $wpdb->get_results($sql); //輸出資料,之後你可以使用 foreach 資料 $post object
if( is_search() && empty($id_arr)) { echo '暫無搜尋結果!'; }else{
foreach($data as $post) {
echo get_the_title($post); //輸出文章標題
}
}
?>
...
OK!大功告成,有什麼問題大家可以留言討論,實際應用請檢視本站,如下圖:
