程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> sphinx安裝與 api 學習筆記整理

sphinx安裝與 api 學習筆記整理

編輯:MySQL綜合教程

Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能

sphinx 安裝

Sphinx在mysql上的應用有兩種方式:

1.    采用API調用,如使用PHP、java等的API函數或方法查詢。優點是可不必對mysql重新編譯,服務端進程“低耦合”,且程序可靈活、方便的調用;缺點是如已有搜索程序的條件下,需修改部分程序。推薦程序員使用。

2.    使用插件方式(sphinxSE)把sphinx編譯成一個mysql插件並使用特定的sql語句進行檢索。其特點是,在sql端方便組合,且能直接返回數據給客戶端。不必二次查詢,在程序上僅需要修改對應的sql,但這對使用框架開發的程序很不方便,比如使用了ORM。另外還需要對mysql進行重新編譯,且需要mysql-5.1以上版本支持插件存儲。

這裡的安裝主要介紹的是第一種通過api調用的方式。Sphinx的安裝如下:

 代碼如下 復制代碼

#下載最新穩定版

wget http://www.sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz

tar xzvf sphinx-0.9.9.tar.gz

cd sphinx-0.9.9

./configure --prefix=/usr/local/sphinx/   --with-mysql  --enable-id64


make

make install

注意:采用這種方式安裝不支持中文分詞。


三、  Sphinx中文分詞中文的全文檢索和英文等latin系列不一樣,後者是根據空格等特殊字符來斷詞,而中文是根據語義來分詞。中文分詞主要有2個插件

1.    Coreseek

Coreseek是現在用的最多的sphinx中文全文檢索,它提供了為Sphinx設計的中文分詞包LibMMSeg ,是基於sphinx的基礎上開發的。

2.    sfc(Sphinx-for-chinese)

sfc(sphinx-for-chinese)是由網友happy兄提供的另外一個中文分詞插件。其中文詞典采用的是xdict。

本節主要介紹Coreseek的安裝方法

四、  Coreseek(支持中文檢索的sphinx)安裝1.    安裝升級autoconf

因為coreseek需要autoconf 2.64以上版本,因此需要升級autoconf,不然會報錯從http://download.chinaunix.net/download.php?id=29328&ResourceID=648下載autoconf-2.64.tar.bz2,安裝方法如下:

 代碼如下 復制代碼

tar -jxvf autoconf-2.64.tar.bz2

cd autoconf-2.64

./configure

make

make install

2.    下載coreseek

新版本的coreseek將詞典和sphinx源程序放在了一個包中,因此只需要下載coreseek包就可以了。

wget http://www.wapm.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz

3.    安裝mmseg(coreseek所使用的詞典)

 代碼如下 復制代碼

tar xzvf coreseek-3.2.14.tar.gz

cd mmseg-3.2.14

./bootstrap    #輸出的warning信息可以忽略,如果出現error則需要解決

./configure --prefix=/usr/local/mmseg3

make && make install

cd ..

4.    安裝coreseek(sphinx)

 代碼如下 復制代碼

cd csft-3.2.14

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

make && make install

cd ..

5.    測試mmseg分詞和coreseek搜索

備注:需要預先設置好字符集為zh_CN.UTF-8,確保正確顯示中文,我的系統字符集為en_US.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

網絡搜索

此時正確的應該返回

words:

1. '網絡': 1 documents, 1 hits

2. '搜索': 2 documents, 5 hits

6.    生成 mmseg詞庫及配置文件

新版本的已經自動生成。


sphinx api 的完整用法及重要屬性,整理一下,以防忘記!

 代碼如下 復制代碼 $cl = new SphinxClient ();
//安裝的默認host:localhost  ,sphinx端口:3312
$cl->SetServer ( "localhost", "3312"); 
//可選,為每一個全文檢索字段設置權重,主要根據你在sql_query中定義的字段的順序,Sphinx系統以後會調整,可以按字段名稱來設定權重.  可以參考SetFieldWeights(array ( 100, 1 )) 
$cl->SetWeights ( array ( 100, 1 ) );  
 
 
//查詢的模式,總共有以下模式:SPH_MATCH_ALL,匹配所有查詢詞(and)(默認模式)SPH_MATCH_ANY, 匹配查詢詞中的任意一個(or)SPH_MATCH_PHRASE, 將整個查詢看作一個詞組,要求按順序完整匹配SPH_MATCH_BOOLEAN, 將查詢看作一個布爾表達式 SPH_MATCH_EXTENDED, 將查詢看作一個 Sphinx 內部查詢語言的表達式 。還有一個特殊的“完整掃描”模式,當如下條件滿足時,該模式被自動激活:
//1. 查詢串是空的(即長度為零)
//2.docinfo存儲方式為 extern在完整掃描模式中,全部已索引的文檔都被看作是匹配的。這類匹配仍然會被過濾、排序或分組,但是並不會做任何真正的全文檢索。這種模式可以用來統一全文檢索和非全文檢索的代碼,或者減輕SQL 服務器的負擔(有些時候 Sphinx 掃描的速度要優於類似的 MySQL 查詢)
$cl->SetMatchMode ( "SPH_MATCH_ALL" ); 
 
 //只搜索forum_id=1或3或7  如果$cl->SetFilter ( "forum_id", array ( 1,3,7 ) ,true); 表示只搜索forum_id!=1或!=2或!=7
$cl->SetFilter ( "forum_id", array ( 1,3,7 ) );
 
//SPH_GROUPBY_DAY,從時間戳中按 YYYYMMDD 格式抽取年、月、日 
//SPH_GROUPBY_WEEK,從時間戳中按 YYYYNNN 格式抽取年份和指定周數(自年初計起)的第一天 
//SPH_GROUPBY_MONTH,從時間戳中按 YYYYMM 格式抽取月份
//SPH_GROUPBY_YEAR,從時間戳中按 YYYY 格式抽取年份  //最終的搜索結果中每組包含一個最佳匹配。分組函數值和每組的匹配數目分別以“虛擬”屬性@group 和@count 的形式返回。
//SPH_SORT_RELEVANCE忽略任何附加的參數,永遠按相關度評分排序。所有其余的模式都要求額外的排序子句,子句的語法跟具體的模式有關。
$cl->SetGroupBy ("UserName", SPH_GROUPBY_ATTR, $groupsort );
 
$cl->SetGroupDistinct ( $distinct );
/*
$cl->SetGroupBy ( "category", SPH_GROUPBY_ATTR, "@count desc" );
$cl->SetGroupDistinct ( "vendor" );
相當於:
SELECT id, weight, all-attributes,
    COUNT(DISTINCT vendor) AS @distinct,
    COUNT(*) AS @count
FROM products
GROUP BY category
ORDER BY @count DESC
*/

  
 
//SPH_SORT_RELEVANCE 模式, 按相關度降序排列(最好的匹配排在最前面)SPH_SORT_ATTR_DESC 模式, 按屬性降序排列 (屬性值越大的越是排在前面)SPH_SORT_ATTR_ASC 模式, 按屬性升序排列(屬性值越小的越是排在前面)SPH_SORT_TIME_SEGMENTS 模式, 先按時間段(最近一小時/天/周/月)降序,再按相關度降序SPH_SORT_EXTENDED 模式, 按一種類似 SQL 的方式將列組合起來,升序或降序排列。SPH_SORT_EXPR 模式,按某個算術表達式排序。

 代碼如下 復制代碼 $cl->SetSortMode ( SPH_SORT_EXTENDED, "post_date");
 
//從第0個開始,取$limit 個,  第三個參數限制了最大偏移量不大於1000
$cl->SetLimits ( 0, $limit, ( $limit>1000 ) ? $limit : 1000 );  

 
//設置評分模式:    * SPH_RANK_PROXIMITY_BM25, 默認模式,同時使用詞組評分和BM25評分,並且將二者結合。* SPH_RANK_BM25, 統計相關度計算模式,僅使用BM25評分計算(與大多數全文檢索引擎相同)。這個模式比較快,但是可能使包含多個詞的查詢的結果質量下降。 * SPH_RANK_NONE, 禁用評分的模式,這是最快的模式。實際上這種模式與布爾搜索相同。所有的匹配項都被賦予權重1。* SPH_RANK_WORDCOUNT, 根據關鍵詞出現次數排序。這個排序器計算每個字段中關鍵字的出現次數,然後把計數與字段的權重相乘,最後將積求和,作為最終結果。* SPH_RANK_PROXIMITY, 版本0.9.9-rc1新增,將原始的詞組相似度作為結果返回。在內部,這個模式被用來模擬SPH_MATCH_ALL的查詢。 * SPH_RANK_MATCHANY, 版本0.9.9-rc1新增,返回之前在SPH_MATCH_ANY中計算的位次,在內部這個模式用於模擬SPH_MATCH_ANY的查詢。* SPH_RANK_FIELDMASK, 版本0.9.9-rc2新增,返回一個32位掩碼,其中第N位對應第N個全文字段,從0開始計數,如果某個字段中出現了滿足查詢的關鍵詞,則對應的標志位被置1。 

 代碼如下 復制代碼 $cl->SetRankingMode ( "SPH_RANK_PROXIMITY_BM25");
 
//PHP專用。控制搜索結果集的返回格式(匹配項按數組返回還是按hash返回)$arrayresult 參數應為布爾型。如果$arrayresult為false(默認),匹配項以PHP hash格式返回,文檔ID為鍵,其他信息(權重、屬性)為值。如果$arrayresult為true,匹配項以普通數組返回,包括匹配項的全部信息(含文檔ID) 
$cl->SetArrayResult ( true );

  
 
//連接到searchd服務器,根據服務器的當前設置執行給定的查詢,取得並返回結果集。$query是查詢字串,$index是包含一個或多個索引名的字符串。一旦發生一般錯誤,則返回假並設置GetLastError()信息。若成功則返回搜索的結果集。此外, $comment 將被發送到查詢日志中搜索部分的前面,這對於調試是非常有用的。目前,注釋的長度限制為128個字符以內。$index的默認值是"*",意思是對全部本地索引做查詢。索引名中允許的字符包括拉丁字母(a-z),數字(0-9),減號(-)和下劃線(_),其他字符均視為分隔符。因此,下面的示例調用都是有效的,而且會搜索相同的兩個索引: 

 代碼如下 復制代碼 $res = $cl->Query ( $query, $index );
/*
$cl->Query ( "test query", "main delta" );
$cl->Query ( "test query", "main;delta" );
$cl->Query ( "test query", "main, delta" );
*/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved