wordpress使用coreseek(sphinx)全文索引

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

轉載請註明:wordpress教程網 » wordpress使用coreseek(sphinx)全文索引(http://www.54ux.com/a-1991.html)

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