全文檢索是數據庫的有力補充,全文檢索並不能替代數據庫在應用系統中的做用。當應用系統的數據以大量的文本信息爲主時,採用全文檢索技術可以極大的提高應用系統的價值。php
數據庫搜索。假設搜索範圍包含全部正文數據。每每性能很是低。用戶響應時間長(分鐘級。經常超時);而全文檢索可以在0.x秒(毫秒級)的時間內將結果反饋給用戶;python
數據庫搜索。一個用戶在搜索。每每影響其它用戶的相應用系統進行操做。全文檢索可以同一時候支持多個用戶併發搜索,其它相應用系統進行操做的用戶不受影響。 mysql
數據庫搜索很是難實現多個關鍵字的複合搜索。而全文檢索可以實現多個關鍵詞的複合搜索。包含 「和(AND)」、「或(OR)」、「否(NOT)」 等; 算法
數據庫搜索難於對結果進行相關度排序,當檢索結果多時。用戶每每難於找到最恰當的文檔。而全文檢索經過統計的研究成果。可以將文檔進行相關度排序後。再返回給用戶,提升用戶的效率;sql
全文檢索還可以對檢索結果的數據進行聚類分析(Group, 這裏的聚類和NLP裏面的聚類算法不一樣)。增進用戶對數據分佈狀況的瞭解。數據庫
全文檢索需要用戶按期運行創建索引的動做,比直接使用數據庫搜索添加了維護的工做; 編程
實現的不無缺的全文索引系統easy形成索引與數據庫的不一致,反而減小了用戶的使用體驗; api
優秀的全文檢索系統支持依照文檔的不一樣字段分配不一樣的檢索權重。依據應用的不一樣動態的改變結果的排序;數組
對於中文、日文和韓文而言,全文檢索支持分詞。進一步縮小告終果集的範圍;而數據庫檢索每每不支持。每每一些與搜索詞絕不相干的內容也混入告終果集。性能優化
全文檢索與數據庫檢索各有優點,需要依據詳細應用場景的不一樣靈活選擇。
全文檢索通常支持中文分詞。而每每有人以爲將現有的不支持中文分詞的全文檢索軟件添加中文分詞模塊就可以使用了。這個觀點自己沒錯,但是可以使用不表明可以用好。
國內有大量的站點採用Lucene+中文分詞的解決方式,但是搜索結果並不樂觀。
中文全文檢索毫不是簡單的將國外的全文檢索軟件包添加中文分詞模塊(漢化的全文檢索)。相比漢化的全文檢索,中文全文檢索引擎主要有例如如下優點:
高精度的分詞算法。有統計以爲。中文分詞的切分精度至少要達到>96% ,才幹對全文檢索的精度和準確率沒有太大影響。
爲中文優化過的結果集排序算法。中文用戶有使用長短語(短句)進行搜索的習慣,而漢化的全文搜索不考慮詞與詞之間的位置關係,嚴重影響了用戶的使用體驗;
可以利用中文的詞性信息。對於不一樣詞性的詞。給與不一樣的排序權重,進一步改善結果集。
對站點設備有要求
自建全文搜索每每需要站長有至少一臺獨立主機,而使用第三方提供的全文搜索對站點的要求低,虛擬主機就能夠;只是,出現全文搜索需求的站點一般已經有本身的獨立主機了。
索引更新更及時
由於搜索服務在第三方託管。其每每僅僅能依照必定的規則按期更新索引庫(每每是幾小時、甚至幾天才更新一次索引)。您站點上的新出現的內容每每不能及時被搜索到。
使用自建全文搜索,可以保證您站點上新出現的內容可以」立刻「被檢索到。
更適應您的站點
由於中文需要進行分詞的特性,致使沒有一套通用的詞庫可以適用於全部站點,要獲得優秀的檢索結果需要定製一套適用於您站點的詞庫;
採用第三方的搜索服務。您是沒法改動第三方廠商的詞庫的。而使用自建全文搜索則無此問題。
更有利於您站點的數據整合
有些站點不止是論壇,每每還包含內容管理(CMS)、商城等多種應用,而使用數據庫搜索每每需要用戶在各個系統中都進行搜索才幹找到內容;
第三方的檢索沒法差異各個系統的不一樣。而自建的全文搜索可以有效的區分各個數據來源的不一樣數據,真正作到一次搜索應有盡有,從而改善您站點的訪問體驗。添加您站點的點擊率。
避免您的訪問者遇到某些尷尬
第三方的搜索結果頁面不是您可以控制改動的,有推薦一些可能會使您站點訪問者尷尬的搜索短語的可能。
而使用自建全文搜索則全然無此問題。
Sphinx是一款基於SQL的高性能全文檢索引擎。Sphinx的性能在衆多全文檢索引擎中也是首屈一指的,利用Sphinx。咱們可以完畢比數據庫自己更專業的搜索功能,並且可以有很是多針對性的性能優化。
Sphinx的特色:
高速建立索引:3分鐘左右就能夠建立近100萬條記錄的索引,並且採用了增量索引的方式,重建索引很是迅速。
閃電般的檢索速度:雖然是1千萬條的大數據量,查詢數據的速度也在毫秒級以上。2-4G的文本量中平均查詢速度不到0.1秒。
爲很是多腳本語言設計了檢索API。如PHP,Python,Perl,Ruby等,所以你可以在大部分編程應用中很是方便地調用Sphinx的相關接口。
爲MySQL設計了一個存儲引擎插件。所以假設你在MySQL上使用Sphinx。那簡直就方便到家了。
支持分佈式搜索,可以橫向擴展系統性能。
Sphinx 全文搜索引擎對英文等拉丁語系支持較好, 對中文等支持較差.
Coreseek 是一款中文全文檢索/搜索軟件。以GPLv2許可協議開源公佈,基於Sphinx研發並獨立公佈。專攻中文搜索和信息處理領域。適用於行業/垂直搜索、論壇/站內搜索、數據庫搜索、文檔/文獻檢索、信息檢索、數據挖掘等應用場景,用戶可以免費下載使用. 並且在全面的中文手冊, 方便部署和使用.
本章節概述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( '@title (測試)' , "*");
//$res=cl->Query( '@title (測試) @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 【該詞彙出現的次數】
)
)
)