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