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!大功告成,有什麼問題大家可以留言討論,實際應用請檢視本站,如下圖: