Sphinx + Coreseek 實現中文分詞搜索
Sphinx + Coreseek 實現中文分詞搜索
- Sphinx Coreseek 實現中文分詞搜索
- 全文檢索
- 1 全文檢索 vs 數據庫
- 2 中文檢索 vs 漢化檢索
- 3 自建全文搜索與使用Google等第三方站點提供的站內全文搜索的差別
- Sphinx
- Coreseek介紹
- Coreseek安裝使用
- 全文檢索
- Sphinx Coreseek 實現中文分詞搜索
1. 全文檢索
1.1 全文檢索 vs. 數據庫
全文檢索是數據庫的有力補充,全文檢索並不能替代數據庫在應用系統中的作用。當應用系統的數據以大量的文本信息為主時,採用全文檢索技術能夠極大的提升應用系統的價值。
數據庫搜索。假設搜索範圍包含所有正文數據。往往性能非常低。用戶響應時間長(分鐘級。常常超時);而全文檢索能夠在0.x秒(毫秒級)的時間內將結果反饋給用戶;
數據庫搜索。一個用戶在搜索。往往影響其它用戶的相應用系統進行操作。全文檢索能夠同一時候支持多個用戶並發搜索,其它相應用系統進行操作的用戶不受影響。
數據庫搜索非常難實現多個關鍵字的復合搜索。而全文檢索能夠實現多個關鍵詞的復合搜索。包含 “和(AND)”、“或(OR)”、“否(NOT)” 等;
數據庫搜索難於對結果進行相關度排序,當檢索結果多時。用戶往往難於找到最恰當的文檔。而全文檢索通過統計的研究成果。能夠將文檔進行相關度排序後。再返回給用戶,提高用戶的效率;
全文檢索還能夠對檢索結果的數據進行聚類分析(Group, 這裏的聚類和NLP裏面的聚類算法不同)。增進用戶對數據分布情況的了解。
全文檢索須要用戶定期運行建立索引的動作,比直接使用數據庫搜索添加了維護的工作;
實現的不完好的全文索引系統easy造成索引與數據庫的不一致,反而減少了用戶的使用體驗;
優秀的全文檢索系統支持依照文檔的不同字段分配不同的檢索權重。依據應用的不同動態的改變結果的排序;
對於中文、日文和韓文而言,全文檢索支持分詞。進一步縮小了結果集的範圍;而數據庫檢索往往不支持。往往一些與搜索詞毫不相幹的內容也混入了結果集。
全文檢索與數據庫檢索各有優勢,須要依據詳細應用場景的不同靈活選擇。
1.2 中文檢索 vs. 漢化檢索
全文檢索一般支持中文分詞。而往往有人覺得將現有的不支持中文分詞的全文檢索軟件添加中文分詞模塊就能夠使用了。這個觀點本身沒錯,可是能夠使用不代表能夠用好。
國內有大量的站點採用Lucene+中文分詞的解決方式,可是搜索結果並不樂觀。
中文全文檢索絕不是簡單的將國外的全文檢索軟件包添加中文分詞模塊(漢化的全文檢索)。相比漢化的全文檢索,中文全文檢索引擎主要有例如以下優勢:
高精度的分詞算法。有統計覺得。中文分詞的切分精度至少要達到>96% ,才幹對全文檢索的精度和準確率沒有太大影響。
為中文優化過的結果集排序算法。中文用戶有使用長短語(短句)進行搜索的習慣,而漢化的全文搜索不考慮詞與詞之間的位置關系,嚴重影響了用戶的使用體驗;
能夠利用中文的詞性信息。對於不同詞性的詞。給與不同的排序權重,進一步改善結果集。
1.3 自建全文搜索與使用Google等第三方站點提供的站內全文搜索的差別
對站點設備有要求
自建全文搜索往往須要站長有至少一臺獨立主機,而使用第三方提供的全文搜索對站點的要求低,虛擬主機就可以;只是,出現全文搜索需求的站點通常已經有自己的獨立主機了。
索引更新更及時
因為搜索服務在第三方托管。其往往僅僅能依照一定的規則定期更新索引庫(往往是幾小時、甚至幾天才更新一次索引)。您站點上的新出現的內容往往不能及時被搜索到。
使用自建全文搜索,能夠保證您站點上新出現的內容能夠”馬上“被檢索到。
更適應您的站點
因為中文須要進行分詞的特性,導致沒有一套通用的詞庫能夠適用於所有站點,要得到優秀的檢索結果須要定制一套適用於您站點的詞庫;
採用第三方的搜索服務。您是無法改動第三方廠商的詞庫的。而使用自建全文搜索則無此問題。
更有利於您站點的數據整合
有些站點不止是論壇,往往還包含內容管理(CMS)、商城等多種應用,而使用數據庫搜索往往須要用戶在各個系統中都進行搜索才幹找到內容;
第三方的檢索無法差別各個系統的不同。而自建的全文搜索能夠有效的區分各個數據來源的不同數據,真正做到一次搜索應有盡有,從而改善您站點的訪問體驗。添加您站點的點擊率。
避免您的訪問者遇到某些尷尬
第三方的搜索結果頁面不是您能夠控制改動的,有推薦一些可能會使您站點訪問者尷尬的搜索短語的可能。
而使用自建全文搜索則全然無此問題。
2. Sphinx
Sphinx是一款基於SQL的高性能全文檢索引擎。Sphinx的性能在眾多全文檢索引擎中也是數一數二的,利用Sphinx。我們能夠完畢比數據庫本身更專業的搜索功能,而且能夠有非常多針對性的性能優化。
Sphinx的特點:
高速創建索引:3分鐘左右就可以創建近100萬條記錄的索引,而且採用了增量索引的方式,重建索引非常迅速。
閃電般的檢索速度:雖然是1千萬條的大數據量,查詢數據的速度也在毫秒級以上。2-4G的文本量中平均查詢速度不到0.1秒。
為非常多腳本語言設計了檢索API。如PHP,Python,Perl,Ruby等,因此你能夠在大部分編程應用中非常方便地調用Sphinx的相關接口。
為MySQL設計了一個存儲引擎插件。因此假設你在MySQL上使用Sphinx。那簡直就方便到家了。
支持分布式搜索,能夠橫向擴展系統性能。
2. Coreseek介紹###
Sphinx 全文搜索引擎對英文等拉丁語系支持較好, 對中文等支持較差.
Coreseek 是一款中文全文檢索/搜索軟件。以GPLv2許可協議開源公布,基於Sphinx研發並獨立公布。專攻中文搜索和信息處理領域。適用於行業/垂直搜索、論壇/站內搜索、數據庫搜索、文檔/文獻檢索、信息檢索、數據挖掘等應用場景,用戶能夠免費下載使用. 而且在全面的中文手冊, 方便部署和使用.
3. Coreseek安裝使用
本章節概述Coreseek安裝說明, 詳細環境及詳細說明請見Coreseek官方中文手冊:http://www.coreseek.cn/products-install/step_by_step/
下面使用MySQL數據源進行說明.
第一步:安裝
安裝coreseek請參考:BSD、Linux、Windows系統安裝測試說明文檔。
安裝後,請確保安裝測試說明文檔中的各項測試都能夠通過,以便coreseek做好準備。為你服務!
第二步: 配置
在BSD/Linux安裝包的testpack/etc文件夾下,放置了演示的配置文件;
在Windows安裝包的etc文件夾下,也放置了演示的配置文件;
假設是mysql數據庫,能夠將csft_mysql.conf拷貝為自己的配置文件,然後進行改動。其它數據庫能夠參考python數據源。
要查看配置的細節,能夠訪問Coreseek/Sphinx(0.9)中文手冊了解詳情和詳細的配置參數。
配置文件的核心。為source和index配置,兩者是成對出現的;假設須要設置針對多種情況或者多個數據表的索引,則可針對每個編寫相應的source和index配置;
source表示從何處取得原始數據。也就是數據源。index表示取得數據後怎樣索引;
source配置中,請確保能夠使用給出的數據庫server地址、用戶、password連接到相應的數據庫,運行獲取數據的SQL語句能夠得到數據。否則coreseek無法得到數據。也就無法提供服務了。
普通情況下,sql_query給出讀取數據的SQL語句,第一列為自增的ID字段,然後能夠包含字符串字段,整數數值字段。整數數值字段須要在後面使用sql_attr_uint明白標註,有多個則分別標註就可以。
index配置中,須要註意改動path參數,確保不與其它的搜索服務發生沖突。最後的search的配置中。也要改動相應的路徑參數和端口參數,以防止沖突發生;
第三步:測試
首先,索引:使用bin文件夾下的indexer,運行:indexer -c 配置文件的路徑 index名稱.
# /usr/local/coreseek/bin/indexer -c etc/csft.conf --all ##--all表示所有索引
##Windows下面為bin\indexer -c etc\csft.conf --all
##下面為正常索引所有數據時的提示信息:部分數據信息依據實際數據情況變化
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‘...
indexing index ‘索引名稱‘...
collected 3 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 3 docs, 7585 bytes
total 0.075 sec, 101043 bytes/sec, 39.96 docs/sec
total 2 reads, 0.000 sec, 5.6 kb/call avg, 0.0 msec/call avg
total 7 writes, 0.000 sec, 3.9 kb/call avg, 0.0 msec/call avg
果出現以上相應的提示。則表示配置正確,能夠正常索引
隨後,啟動搜索:使用bin文件夾下的searchd。運行:searchd -c 配置文件的路徑 –console
# /usr/local/coreseek/bin/searchd -c etc/csft.conf --console
##Windows下面為bin\searchd -c etc\csft.conf --console
##下面為正常開啟搜索服務時的提示信息:當中的port能夠在配置文件裏改動
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
如要繼續測試搜索功能,請不要停止searchd。否則其它程序將無法連接到搜索服務端
BSD/Linux環境下,測試成功後:
如要後臺運行服務,則使用:searchd -c 配置文件的路徑。將searchd作為後臺服務運行;
假設要停止後臺服務,則使用:searchd -c 配置文件的路徑 –stop;
假設要更新後臺服務的索引,則使用:indexer -c 配置文件的路徑 index名稱
假設要將搜索結果應用到自己的程序之中,請使用api文件夾下相應的api接口測試。
PHP接口的測試例如以下:
//註意文件的編碼格式須要保存為為UTF-8格式
require ( "sphinxapi.php" );
$cl = new SphinxClient ();
$cl->SetServer ( ‘127.0.0.1‘, 9312);
//下面設置用於返回數組形式的結果
$cl->SetArrayResult ( true );
/*
//ID的過濾
$cl->SetIDRange(3,4);
//sql_attr_uint等類型的屬性字段,須要使用setFilter過濾,相似SQL的WHERE group_id=2
$cl->setFilter(‘group_id‘,array(2));
//sql_attr_uint等類型的屬性字段,也能夠設置過濾範圍,相似SQL的WHERE group_id2>=6 AND group_id2<=8
$cl->SetFilterRange(‘group_id2‘,6,8);
*/
//取從頭開始的前20條數據,0,20相似SQl語句的LIMIT 0,20
$cl->SetLimits(0,20);
//在做索引時,沒有進行 sql_attr_類型 設置的字段,能夠作為“搜索字符串”,進行全文搜索
$res = $cl->Query ( ‘搜索字符串‘, "*" ); //"*"表示在所有索引裏面同一時候搜索。"索引名稱(比如test或者test,test2)"則表示搜索指定的
//假設須要搜索指定全文字段的內容,能夠使用擴展匹配模式:
//$cl->SetMatchMode(SPH_MATCH_EXTENDED);
//$res=cl->Query( [email protected] (測試)‘ , "*");
//$res=cl->Query( [email protected] (測試) @content (‘網絡‘)‘ , "*");
echo ‘<pre>‘;
print_r($res[‘matches‘]);
print_r($res);
print_r($cl->GetLastError());
print_r($cl->GetLastWarning());
echo ‘</pre>‘;
搜索結果演示樣例:
Array
(
[error] => 【本次查詢的錯誤信息】
[warning] =>
[status] => 0
[fields] => Array
(
[0] => title
[1] => content
)
[attrs] => Array
(
[published] => 2
[author_id] => 1
[a] => 1
)
[matches] => Array 【匹配到的文檔信息】
(
[0] => Array
(
[id] => 3 【文檔的ID】
[weight] => 1680
[attrs] => Array
(
[published] => 1270094460
[author_id] => 2
[a] => 0
)
)
)
[total] => 1 【本次查詢返回的結果數目。比如翻頁等使用】
[total_found] => 1 【整個系統包含的結果數目】
[time] => 0.136 【查詢使用的時間】
[words] => Array 【分詞結果】
(
[server] => Array
(
[docs] => 1 【該詞匯匹配到的文檔數目】
[hits] => 1 【該詞匯出現的次數】
)
)
)
Sphinx + Coreseek 實現中文分詞搜索