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)