一,軟件準備 |
爲了不安裝中出現依賴包缺失,你須要打一句雞血:php
yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel #或 apt-get install make gcc g++ automake libtool mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev #更多系統配置請點此傳送查看
二,coreseek快速安裝 |
##前提:需提早安裝操做系統基礎開發庫及mysql依賴庫以支持mysql數據源和xml數據源 ##安裝mmseg $ cd mmseg-3.2.14 $ ./bootstrap #輸出的warning信息能夠忽略,若是出現error則須要解決 $ ./configure --prefix=/usr/local/mmseg3 $ make && make install $ cd ..
【注意】若是編譯mmseg提示cannot find input file: src/Makefile.in失敗,能夠嘗試下面解決方法:html
#下面命令提示沒有安裝,則先安裝 aclocal libtoolize --force 運行後有一個錯誤,不用管它。 automake --add-missing autoconf autoheader make clean ./configure --prefix=/usr/local/mmseg3
##安裝coreseek $ cd csft-4.1 $ sh buildconf.sh #輸出的warning信息能夠忽略,若是出現error則須要解決 $ ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql ##若是提示mysql問題,能夠查看MySQL數據源安裝說明
#不想麻煩,能夠直接使用下面這句
$ ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql-includes=《mysql安裝目錄》/include --with-mysql-libs=《mysql安裝目錄》/lib
$ make && make install $ cd ..
【注意】若是出現Sphinx/Coreseek 4.1 執行 buildconf.sh 報錯,沒法生成configure文件的問題,點此傳送解決。值得一提的是vi‘替換全部’小技巧:末行模式下輸入「:1,$s/T val = ExprEval ( this->m_pArg, tMatch )/T val = this->ExprEval ( this->m_pArg, tMatch )/g」從第一行開始替換到最後一行python
##測試mmseg分詞,coreseek搜索(須要預先設置好字符集爲zh_CN.UTF-8,確保正確顯示中文) $ cd testpack $ cat var/test/test.xml #此時應該正確顯示中文 $ /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml $ /usr/local/coreseek/bin/indexer -c etc/csft.conf --all $ /usr/local/coreseek/bin/search -c etc/csft.conf 網絡搜索
【注意】 mysql
1,若是輸入/usr/local/coreseek/bin/indexer -c etc/csft.conf --all 時報/usr/local/coreseek/bin/indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory 錯誤,能夠經過vi編輯 /etc/ld.so.conf文件來修復這個錯,將 /usr/local/mysql/lib 加到文件到尾部,並保存文件,而後運行ldconfig命令便可。linux
2,若是輸入/usr/local/coreseek/bin/indexer -c etc/csft.conf --all,報xmlpipe2 support NOT compiled in. To use xmlpipe2, install missing錯誤,則apt-get install expat-* 或yum
install
expat-devel*
安裝後從新編輯安裝coreseek。c++
三,Sphinx配置mysql數據源: |
1./usr/local/coreseek/bin/indexer indexer文件,用於創建/更新/合併數據源的索引
/usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all 爲csft_mysql.conf配置文件中配置的全部數據源創建索引
2./usr/local/coreseek/bin/search search文件,用於測試數據源的搜索
/usr/local/coreseek/bin/search -c etc/csft_mysql.conf 網絡搜索 測試csft_mysql.conf配置文件中配置的數據源是否有「網絡搜索」這個內容
3./usr/local/coreseek/bin/searchd searchd文件,負責接受查詢、處理查詢和返回數據集的服務
/usr/local/coreseek/bin/searchd -c etc/csft_mysql.conf 經過csft_mysql.conf的searchd配置開啓負責接受查詢、處理查詢和返回數據集的服務
2,再者,搞清楚咱們要爲mysql中的某個數據庫中哪(幾)個表創建索引。
下面以一個案例做爲例子講解:
一個在線聊天項目,使用了數據庫test_qq,以say做爲存儲聊天內容表,此項目有一個「查找聊天記錄」的功能,此表內容基本會達到海量的,所以爲了提升查找速度,爲表say創建索引(sphinx的數據源),表say有以下結構:
mysql> use test_qq; Database changed mysql> desc say; +---------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | fromid | int(10) unsigned | NO | | 0 | | | toid | int(10) unsigned | NO | | 0 | | | content | text | NO | | NULL | | +---------+------------------+------+-----+---------+----------------+
要配置mysql數據源,咱們將coreseek安裝包/testpack/etc 下的csft_mysql.conf文件複製到coreseek 的etc目錄中:
cp /coreseek安裝包位置/testpack/etc/csft_mysql.conf /usr/local/coreseek/etc/
修改csft_mysql.conf
1 #源定義 2 source mysql #源名,自定義 3 { 4 type = mysql ## 說明數據源的類型。數據源的類型能夠是:mysql,pgsql,mssql,xmlpipe,odbc,python 5 sql_host = localhost 6 sql_user = root 7 sql_pass = 123 8 sql_db = test_qq 9 sql_port = 3306 10 sql_query_pre = SET NAMES utf8 11 sql_query = SELECT id,fromid,toid,content FROM say 12 sql_attr_uint = id #從SQL讀取到的值必須爲整數(unsigned) 13 sql_attr_timestamp = date_added #從SQL讀取到的值必須爲整數,做爲時間戳屬性,常常被用於作排序 14 15 sql_query_info_pre = SET NAMES utf8 #命令行查詢時,設置正確的字符集 16 sql_query_info = SELECT * FROM say WHERE id=$id #命令行查詢時,從數據庫讀取原始數據信息 17 } 18 19 #index定義 20 index mysql #索引名,自定義 21 { 22 source = mysql #對應的source源名稱 23 path = /usr/local/coreseek/var/data/mysql #索引文件所在位置,文件名通常是索引名,請修改成實際使用的絕對路徑 24 docinfo = extern 25 mlock = 0 26 morphology = none 27 min_word_len = 1 28 html_strip = 0 29 ngram_len = 0 30 charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux環境下設置 31 charset_type = zh_cn.utf-8 32 } 33 34 #searchd服務定義 35 searchd 36 { 37 listen = 9312 38 read_timeout = 5 39 max_children = 30 40 max_matches = 1000 41 seamless_rotate = 0 42 preopen_indexes = 0 43 unlink_old = 1 44 pid_file =/usr/local/coreseek/var/log/searchd_mysql.pid #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 45 log = /usr/local/coreseek/var/log/searchd_mysql.log #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 46 query_log = /usr/local/coreseek/var/log/query_mysql.log #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 47 binlog_path = #關閉binlog日誌 48 compat_sphinxql_magics = 0 49 }
修改後,先開啓searchd後臺服務
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf
再執行總體索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all
此時即可以使用search 來測試搜索
/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf 你好
得出搜索結果,即爲配置成功
可是問題來了,indexer索引是一次性的,若是是10:00am執行索引,search就只能搜索到10:00am之前的內容,那若是更多的人在10:00am後發消息,say表中多出的聊天內容行就沒法被索引到,search測試也就沒法搜索到多出的內容,咱們就考慮到增量索引。
•配置增量索引:
1.在mysql中建立索引記錄偏移表sph_say_counter,當執行一次索引後,sph_say_counter表更新該次索引最大id,等下次執行索引時,便從該記錄的最大id開始執行索引,執行後再將該次索引最大id記錄到sph_say_counter中。如此重複。
sph_say_counter表結構:sql
mysql> desc sph_say_counter; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment | | max_offset | int(10) unsigned | NO | | 0 | | +------------+---------------------+------+-----+---------+----------------+
2. 在csft_mysql.conf增長增量索引配置shell
#增長如下配置 source delta : mysql #此寫法爲delta繼承mysql源中的全部配置,若是子配置中有相同配置,則覆蓋父配置 { sql_query = SELECT id,fromid,toid,content FROM say WHERE id > (SELECT max_offset FROM sph_say_counter WHERE id = 1) #從記錄大於max_offset後的數據開始索引 sql_query_post = REPLACE INTO sph_say_counter(id,max_offset) SELECT 1,MAX(id) FROM say #索引後更新最大記錄,sql_query_pre是執行查詢前執行的語句,sql_query_post是執行查詢後再執行的語句 } index delta : mysql { source = delta path = /usr/local/coreseek/var/data/delta
}
此時執行增量索引 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate 後,即可以經過search搜索到多出內容的搜索結果數據庫
能夠經過合併索引 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge mysql delta --rotate --merge-dst-range deleted 0 0 來合併mysql源和delta源的索引 (--merge-dst-range deleted 0 0 是爲了防止多個關鍵字指向同一個文檔)bootstrap
爲了在執行索引時也能夠更新sph_say_counter表,在source mysql內也加入這句:
sql_query_pre = REPLACE INTO sph_say_counter(id,max_offset) SELECT 1,MAX(id) FROM say
此時執行 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate 即可以從新創建全部索引並更新sph_say_counter表
到此csft_mysql.conf完整配置爲:
1 #源定義 2 source mysql #源名,自定義 3 { 4 type = mysql ## 說明數據源的類型。數據源的類型能夠是:mysql,pgsql,mssql,xmlpipe,odbc,python 5 6 sql_host = localhost 7 sql_user = root 8 sql_pass = 123 9 sql_db = test_qq 10 sql_port = 3306 11 sql_query_pre = SET NAMES utf8 12 sql_query_pre = REPLACE INTO sph_say_counter(id,max_offset) SELECT 1,MAX(id) FROM say 13 sql_query = SELECT id,fromid,toid,content FROM say 14 sql_attr_uint = id #從SQL讀取到的值必須爲整數 15 sql_attr_timestamp = date_added #從SQL讀取到的值必須爲整數,做爲時間屬性 16 17 sql_query_info_pre = SET NAMES utf8 #命令行查詢時,設置正確的字符集 18 sql_query_info = SELECT * FROM say WHERE id=$id #命令行查詢時,從數據庫讀取原始數據信息 19 } 20 21 #index定義 22 index mysql #索引名,自定義 23 { 24 source = mysql #對應的source名稱 25 path = /usr/local/coreseek/var/data/mysql #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 26 docinfo = extern 27 mlock = 0 28 morphology = none 29 min_word_len = 1 30 html_strip = 0 31 ngram_len = 0 32 charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux環境下設置,/符號結尾 33 charset_type = zh_cn.utf-8 34 } 35 36 source delta : mysql #繼承名爲mysql源配置的delta 37 { 38 sql_query_pre = 39 sql_query = SELECT id,fromid,toid,content FROM say WHERE id > (SELECT max_offset FROM sph_say_counter WHERE id = 1) 40 sql_query_post = REPLACE INTO sph_say_counter(id,max_offset) SELECT 1,MAX(id) FROM say 41 } 42 index delta : mysql 43 { 44 source = delta 45 path = /usr/local/coreseek/var/data/delta 46 } 47 48 49 #全局index定義 50 indexer 51 { 52 mem_limit =32M 53 } 54 55 #searchd服務定義 56 searchd 57 { 58 listen = 9312 59 read_timeout = 5 60 max_children = 30 61 max_matches = 1000 62 seamless_rotate = 0 63 preopen_indexes = 0 64 unlink_old = 1 65 pid_file =/usr/local/coreseek/var/log/searchd_mysql.pid #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 66 log = /usr/local/coreseek/var/log/searchd_mysql.log #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 67 query_log = /usr/local/coreseek/var/log/query_mysql.log #請修改成實際使用的絕對路徑,例如:/usr/local/coreseek/var/... 68 binlog_path = #關閉binlog日誌 69 compat_sphinxql_magics = 0 70 }
3.將執行索引加入到Linux計劃任務中,定時執行更新,合併,總體索引
爲了方便,咱們將執行總體索引,增量索引,合併索引分別寫到3個shell文件中
cd /usr/local/coreseek/sh vi all.sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate vi delta.sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate vi merge.sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge mysql delta --rotate --merge-dst-range deleted 0 0
而後,執行crontab -e 寫入以下內容
*/1 * * * * /bin/sh /usr/local/coreseek/sh/delta.sh >/dev/null 2>&1 ##每1分鐘執行增量索引 */5 * * * * /bin/sh /usr/local/coreseek/sh/merge.sh >/dev/null 2>&1 ##每5分鐘合併索引 30 1 * * * /bin/sh /usr/local/coreseek/sh/all.sh >/dev/null 2>&1 ##天天的1:30執行總體索引
具體執行時間隨本身定義,關於linux計劃任務的更多配置,你能夠點擊此傳送查看詳細。
關於rotate,能夠點此查看詳細。
此步驟後,mysql數據源配置基本完畢,詳細mysql數據源配置,能夠到點此查看,關於配置文件詳細解析,能夠點此查看。
四,PHP使用Sphinx/Coreseek的三種方式: |
四-1,使用sphinxapi.php |
在/coreseek安裝包/testpack/api目錄下提供了PHP的接口文件 sphinxapi.php,這個文件包含一個SphinxClient的類,你能夠複製到項目目錄下包含使用。
1 <?php 2 3 /* 4 test_sph.php 5 SphinxClient類測試 6 */ 7 8 $key=trim($_GET['key']); 9 echo $key; 10 include('sphinxapi.php'); 11 12 $sp=new SphinxClient(); 13 $sp->SetServer('localhost',9312); 14 $sp->SetArrayResult(true); 15 $sp->SetMatchMode(SPH_MATCH_ALL); 16 $sp->SetSortMode(SPH_SORT_RELEVANCE); 17 $res=$sp->Query($key,'mysql'); 18 19 echo '<pre>'; 20 print_r($res); 21 echo '</pre>'; 22 23 if(isset($res['matches'])&&count($res['matches'])>0) 24 { 25 $mysql=new PDO("mysql:localhost;dbname=test_qq",'root','123'); 26 $mysql->query('set names utf8'); 27 $mysql->query('use test_qq'); 28 $sql='select * from say where id in('; 29 30 foreach ($res['matches'] as $v) 31 { 32 $sql.=$v['id'].','; 33 } 34 $sql=trim($sql,',').')'; 35 36 echo $sql; 37 foreach($mysql->query($sql) as $v) 38 { 39 echo '<pre>'; 40 print_r($v); 41 echo '</pre>'; 42 } 43 } 44 else 45 { 46 echo '沒有記錄'; 47 }
瀏覽器輸入localhost/test_sph.php?key=搜索關鍵字 查看搜索結果
四-2,安裝php的sphinx擴展 |
除了能夠直接包含 sphinxapi.php文件,還能夠經過安裝php的sphinx擴展模塊來直接調用SphinxClient,且效率比包含api文件要高,安裝sphinx須要依賴libsphinxclient包,所以先安裝。
1 # cd /coreseek安裝包目錄/csft-4.1/api/libsphinxclient/ 2 # ./configure --prefix=/usr/local/sphinxclient 3 4 configure: creating ./config.status 5 config.status: creating Makefile 6 config.status: error: cannot find input file: Makefile.in #報錯configure失敗 7 8 //處理configure報錯 9 編譯過程當中報了一個config.status: error: cannot find input file: src/Makefile.in這個的錯誤,而後運行下列指令再次編譯就能經過了: 10 # aclocal 11 # libtoolize --force 12 # automake --add-missing 13 # autoconf 14 # autoheader 15 # make clean 16 17 //重新configure編譯 18 # ./configure 19 20 # make && make install
1 http://pecl.php.net/package/sphinx 2 # wget http://pecl.php.net/get/sphinx-1.3.0.tgz 3 # tar zxvf sphinx-1.3.0.tgz 4 # cd sphinx-1.3.0 5 # phpize 6 # ./configure --with-php-config=/usr/bin/php-config --with-sphinx=/usr/local/sphinxclient 7 # make && make install 8 # cd /etc/php.d/ 9 # cp gd.ini sphinx.ini 10 # vi sphinx.ini 11 12 extension=sphinx.so 13 14 # service php-fpm restart
安裝完畢後,你可使用四-2的 test_sqh.php測試搜索
1 <?php 2 header("Content-type: text/html; charset=utf-8"); 3 require("./sphinxapi.php"); 4 $s = new SphinxClient; 5 $s->setServer("192.168.252.132", 9312); 6 7 //SPH_MATCH_ALL, 匹配全部查詢詞(默認模式); SPH_MATCH_ANY, 匹配查詢詞中的任意一個; SPH_MATCH_EXTENDED2, 支持特殊運算符查詢 8 $s->setMatchMode(SPH_MATCH_ALL); 9 $s->setMaxQueryTime(30); //設置最大搜索時間 10 $s->SetArrayResult(false); //是否將Matches的key用ID代替 11 $s->SetSelect ( "*" ); //設置返回信息的內容,等同於SQL 12 $s->SetRankingMode(SPH_RANK_BM25); //設置評分模式,SPH_RANK_BM25可能使包含多個詞的查詢的結果質量降低。 13 //$s->SetSortMode(SPH_SORT_EXTENDED); //發現增長此參數會使結果不許確 14 //$s->SetSortMode(SPH_SORT_EXTENDED,"from_id asc,id desc"); //設置匹配項的排序模式, SPH_SORT_EXTENDED按一種相似SQL的方式將列組合起來,升序或降序排列。 15 $weights = array ('company_name' => 20); 16 $s->SetFieldWeights($weights); //設置字段權重 17 $s->SetLimits ( 0, 30, 1000, 0 ); //設置結果集偏移量 SetLimits (便宜量,匹配項數目,查詢的結果集數默認1000,閥值達到後中止) 18 //$s->SetFilter ( $attribute, $values, $exclude=false ); //設置屬性過濾 19 //$s->SetGroupBy ( $attribute, $func, $groupsort="@group desc" ); //設置分組的屬性 20 $res = $s->query('@* "汽車"','main','--single-0-query--'); #[寶馬]關鍵字,[news]數據源source 21 22 23 //代碼高亮 24 $tags = array(); 25 $tags_name = array(); 26 foreach($res['matches'] as $key=>$value){ 27 $tags[] = $value['attrs']; 28 $company_name[] = $value['attrs']['company_name']; 29 $description[] = $value['attrs']['description']; 30 } 31 $company_name = $s->BuildExcerpts ($company_name, 'main', '汽車', $opts=array() ); //執行高亮,這裏索引名字千萬不能用* 32 $description = $s->BuildExcerpts ($description, 'main', '汽車', $opts=array() ); //執行高亮,這裏索引名字千萬不能用* 33 foreach($tags as $k=>$v) 34 { 35 $tags[$k]['company_name'] = $company_name[$k]; //高亮後覆蓋 36 $tags[$k]['description'] = $description[$k]; //高亮後覆蓋 37 } 38 39 // 高亮後覆蓋 40 $i = 0; 41 foreach($res['matches'] as $key=>$value){ 42 $res['matches'][$key] = $tags[$i]; 43 $i++; 44 } 45 46 $err = $s->GetLastError(); 47 48 echo '<pre>'; 49 var_export($res); 50 var_export($err); 51 echo '</pre>';
更多SphinxClient類的資料,能夠參考官方文檔。
四-3,爲 MySQL 5.5.x 編譯安裝 SphinxSE |
直接安裝SphinxSe做爲mysql的存儲引擎,php的無需做任何改變,便可使用sphinx的全文索引。
#---------------MySQL 5.5 基本設置編譯----------- #如下指令中的VERSION表示MySQL的版本,例如:5.5.8,或者5.5.9 $ tar xzvf coreseek-4.1-beta.tar.gz $ tar xzvf mysql-VERSION.tar.gz #就是上面下載的mysql源碼包 $ cp -R coreseek-4.1-beta/csft-4.1/mysqlse mysql-VERSION/storage/sphinx #上面語句是將mysqlse文件夾複製到storage文件夾下並改名爲sphinx,請注意 $ cd mysql-VERSION $ cmake . -DCMAKE_BUILD_TYPE=Release -DWITH_SPHINX_STORAGE_ENGINE=1 #若是提示沒有命令 先"yum -y install cmake" 安裝cmake #若是上面語句報「Warning: Bison executable not found in PATH」,則安裝bison,再運行此語句
#若是提示缺乏ncurses庫,則 apt-get install libncurses-dev 或 yum -y install ncurses-devel 安裝ncurses庫後,刪除CMakeCache.txt文件,再從新cmake便可
#如要查看cmake可用參數,請執行:cmake . -LH $ make #----------將SphinxSE安裝到已經安裝的MySQL 5.5中----------- #首先執行:MySQL 5.5 基本設置編譯過程 #特別注意:須要選擇與當前已安裝的MySQL 5.5對應的版本進行編譯 $ cp storage/sphinx/ha_sphinx.so /path_to_your_mysql_5.5/lib/plugin $ mysql -uroot -p??? mysql>install plugin sphinx soname "ha_sphinx.so"; mysql>show engines; #ENGINE列表顯示出SPHINX表示安裝成功
測試使用SphinxSe:
#-------------------------測試SphinxSe-------------------------------------- mysql> use test_qq; mysql> CREATE TABLE documents_sphinxse -> ( -> id INTEGER UNSIGNED NOT NULL, -> weight INTEGER NOT NULL, -> query VARCHAR(3072) NOT NULL, -> group_id INTEGER, -> INDEX(query) -> ) ENGINE=SPHINX CONNECTION="sphinx://localhost:9312/mysql";
#-----------執行sphinxse查詢-----------------------------
mysql>SELECT * FROM documents_sphinxse WHERE query='網絡搜索;mode=any';
#--------執行關聯SphinxSE查詢,獲取原始數據信息:-----------
mysql>SELECT dse.*, d.title FROM documents_sphinxse AS dse LEFT JOIN documents AS d USING(id) WHERE query='網絡搜索;mode=any';
五,參考文檔 |
http://blog.csdn.net/e421083458/article/details/21529969
http://www.coreseek.cn/products-install/sphinxse/
http://blog.csdn.net/keyunq/article/details/45129867
http://www.cnblogs.com/yjf512/p/3598332.html