全文檢索是一種將文件裏所有文本與檢索項匹配的文字資料檢索方法,全文檢索是將存儲於數據庫中整本書、整篇文章中的隨意內容信息查找出來的檢索。它可以依據需要得到全文中有關章、節、段、句、詞等信息,也可以進行各類統計和分析。python
全文檢索易龍天網的設計師以爲可以把它劃分爲二部分:mysql
全文web
全文顧名思義:就是全文檢索的對象,它多是一段話,也多是一片文章,它多是一個文件比方:word,txt也能是隨意一種擴展名結尾的文件算法
檢索sql
描文章中的每一個詞,對每一個詞創建一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時依據創建的索引查找,相似於經過字典的檢索字表查字的過程。數據庫
sphinx定義數組
Sphinx是一個基於SQL的全文檢索引擎,可以結合MySQL,PostgreSQL作全文搜索,它可以提供比數據庫自己更專業的搜索功能,使得應用程序更easy實現專業化的全文檢索。Sphinx特別爲一些腳本語言設計搜索API接口,如PHP,Python,Perl,Ruby等,同一時候爲MySQL也設計了一個存儲引擎插件。架構
sphinx特色編輯器
Sphinx 單一索引最大可包括1億條記錄,在1千萬條記錄狀況下的查詢速度爲0.x秒(毫秒級)。Sphinx建立索引的速度爲:建立100萬條記錄的索引僅僅需 3~4分鐘,建立1000萬條記錄的索引可以在50分鐘內完畢,而僅僅包括最新10萬條記錄的增量索引,重建一次僅僅需幾十秒ui
這說明coreseek集合了sphinx的功能,支持不少其它的數據源,在字典,創建索引,分詞更好的支持中文。可以這樣理解,coreseek就是支持中文的sphinx全文檢索
顧名思義:數據源就是爲全文檢索提供索引數據的源頭,coreseek包含但不限制下面三種數據源
l xml
l mysql
l python
coreseek爲了擴展,添加了python數據源功能,從而得以無限擴展Coreseek/Sphinx的數據獲取功能因爲Python眼下具有操做所有類型數據庫的能力,從而coreseek也可以從隨意一種數據庫之中獲取數據;固然,也支持從Python可以操做的隨意其它數據來源獲取數據。
不一樣的數據源生成索引配置不同,但是他們都是爲生成索引提供數據的
生成詞典
詞庫是以txt結尾的文件,而詞典是以lib結尾的文件,詞典是詞庫生成出來的,coreseek默認自帶中文詞庫,咱們也可以本身定義詞庫信息
詞典的構造:
需要用到sphinx服務命令mmseg -u unigram.txt,該命令運行後,將會在unigram.txt所在文件夾中產生一個名爲unigram.txt.uni的文件,將該文件更名爲uni.lib,完畢詞典的構造。需要注意的是,unigram.txt需要預先準備,並且編碼格式必須爲UTF-8編碼。
詞典文件格式:
河 187
x:187
造假者 1
x:1
臺北隊 1
x:1
湖邊 1
第一行爲詞項,其格式爲:[詞條]\t[詞頻率]。特別提醒,有的編輯器會使用4到8個空格表明\t,這將致使該詞條沒法解析。需要注意的是,對於單個字後面跟這個字做單字成詞的頻率,這個頻率需要在大量的預先切分好的語料庫中進行統計,用戶添加或刪除詞時,通常不需要改動這個數值;對於非單字詞,詞頻率處必須爲1。第二行爲佔位項,是由於LibMMSeg庫的代碼是從Coreseek其它的分詞算法庫(N-gram模型)中改造而來的,在原來的應用中,第二行爲該詞在各類詞性下的分佈頻率。LibMMSeg的用戶僅僅需要簡單的在第二行處填"x:1"就能夠。
用戶可以經過改動詞典文件添加本身的本身定義詞,以提升分詞法在某一詳細領域的切分精度
當咱們配置好mysql數據源時候,sex字段數據將以屬性字段存儲在索引,而name字段將以全文檢索字段存儲在索引表裏,生成索引需要用到詞典表,當咱們詞庫裏設置的分詞格式是:
小紅 1
x:1
小明 1
x:1
生成的索引表爲
詞庫分詞格式咱們沒有特殊設置小紅,小明時候:詞庫依照默認規則 把小 和 明 小 和 紅 單字拆分生成索引
生成的索引表爲:
搜索原理
仍是以mysql數據源數據舉例,當咱們生成完索引進行搜索:
以「小明紅」進行搜索時候,keyword會先依據詞庫拆分,默認我們以上面第二中分詞格式,拆分的獲得的詞爲「小」,「紅」,「明」,而後以拆分的詞在索引表裏查詢數據,獲得的結果是
過濾關鍵詞
爲關鍵詞過濾一些特殊字符,經過sphinxAPI自帶方法,結合字典把關鍵詞進行分詞,並且過濾一些特殊字符,過濾後在把拆分的詞再拼接起來進行檢索,好比:百度搜索
百度會本身主動把@&特殊字符過濾掉,再進行搜索,從而不影響搜索結果
設置filter
sphinx索引裏的兩種字段
在sphinx裏有兩種字段,一種可以理解爲屬性字段,一種可以理解爲索引字段,屬性字段就是以數值形式存儲在索引數據裏的字段,它包含不能用來索引,這樣的類型的字段通常都是用來設置filter、以及作排序,另外一種全文檢索字段就是以字符形式存儲在索引數據裏,這樣的類型的字段通常都用來進行分詞,好比文章內容,文章標題,等以字符形式存在的數據。如下就是索引裏字段的介紹
id :ID屬性,必須提供,在SQL語句中字段名稱不限
相應SQL查詢的第一個字段,系統本身主動使用,內部屬性名爲@id,不需要也不能在配置中設定
使用SetFilter()過濾,或者使用SetIDRange()過濾;
SphinxSE之中,使用filter或者minid, maxid過濾
sql_attr_uint :整數屬性,以上group_id、date_added均可用此設置,使用SetFilter()過濾,
或者使用SetFilterRange()過濾;
SphinxSE之中,使用filter或者range過濾;
sql_attr_float :浮點數屬性,以上score可用此設置,使用SetFilterFloatRange()進行範圍過濾,
SphinxSE之中,使用range過濾;
sql_attr_timestamp:timestamp屬性,整數,以上date_added可用此設置,可用SetFilter()過濾
或者使用SetFilterRange()過濾;
SphinxSE之中,使用filter或者range過濾
sql_attr_str2ordinal:字符串序列屬性,以上title可用此設置,僅用於依據該字段排序
但是設置後,該屬性不可用於過濾,也不會保存實際字符串內容,更不能全文檢索
搜索結果中,其相應的信息爲整數,由系統計算出來的排序序列值
全文檢索字段 :全文檢索字段,以上title、content等字符串或者文本的字段均可用此設置
不論什麼出現在SQL語句中,既不是ID屬性,也沒有使用「sql_attr_類型」設置的字段,都是全文字段,
使用Query()搜索;
SphinxSE之中,使用query的查詢文本進行搜索
filter
設置filter就是針對屬性字段過濾,依照上面的mysql數據源表進行分析:僅僅搜索男生數據,需要在sphinx搜索以前,過濾掉女生數據,這就需要在生成索引配置把sex字段設爲索引的屬性字段,這樣就可以在搜索以前進行過濾,而不是在搜索以後再過濾,從而加快了sphinx搜索速度。
設置範圍(limit)
至關於mysql數據庫搜索時候的limit,也就是設置一個返回數據範圍,當從索引搜索出來的數據爲100時候,但是我僅僅想要前10條,這就需要用到設置limit
設置權重(需要時候設置)
爲字段設置權重,比方 name (char) body(text) 字段假設把這兩個字段都生成索引,咱們爲name設置權重高,那麼當咱們爲搜索返回的值設置排序的時候可以依照權重排序,這樣兩條數據,第一條數據name字段存在搜索的keyword,第二條數據body存在搜索的keyword,設置權重排序,因爲咱們爲字段name設置權重高,排序第一條數據要優先於第二條數據
設置排序
sphinx默認提供6種排序方式,詳細請查看相關資料,在這裏我給你們介紹按一種相似SQL的方式將列組合起來,升序或降序排列,方式
@weight DESC,content_hit desc,@id ASC
增長「@」表明此字段是sphinx提供的字段,不加「@」表明是數據源提供的字段,上面一句代碼的意思是:
先依照權重進行倒序,而後依照其它數據源提供的字段排序,這裏用到的數據源字段 都是索引裏的屬性字段,屬性字段上面已經和你們說過了。
設置搜索表達式
咱們可以設置keyword在索引裏每一個全文檢索字段裏進行查找,也可以針對某一個全文檢索字段查找。例:
一、Query($keyword,$index,true);
二、Query("@name ({$keyword})",$index,true);
返回索引查詢獲得的ID數組
query運行後,檢索完畢,sphinx會爲咱們返回數組形式的值,值不只包含搜索的一些相關信息,假設搜索到數據還會返回以二維數組形式存在的數據,二維數據包含 ID 相應數據源裏數據的惟一標示字段(如 主鍵ID),以及一些索引裏存儲的屬性字段
查詢數據庫
經過上面獲得的二維數據,得到ID,經過它可以在數據源查詢相應的相關信息
給查詢出來的數據高亮顯示
查詢出相關信息,爲相關信息中的keyword進行高亮處理
. 應用
搜索引擎
百度、谷歌等搜索引擎
隨着網民對互聯網的需求愈來愈多,網民查看新聞、信息的方式發生轉變,搜索引擎的出現,改變了網民網上查看新聞、信息的瀏覽習慣。試想當不存在搜索引擎當不存在全文檢索,咱們在網上查找東西是多麼費事的一件事情啊!
智能機器人
全文檢索爲智能化的推動提供了優秀的解決方式,智能機器人的出現在WEB,電視,手機等領域已經普遍應用。
謝謝關注websites博客!