Coreseek/sphinx全文檢索的了解
Coreseek/sphinx全文檢索的了解
概述:
全文檢索是一種將文件中所有文本與檢索項匹配的文字資料檢索方法,全文檢索是將存儲于數據庫中整本書、整篇文章中的任意內容信息查找出來的檢索。它可以根據需要獲得全文中有關章、節、段、句、詞等信息,也可以進行各種統計和分析。
定義:
全文檢索易龍天網的設計師認為可以把它劃分為二部分:
全文
全文顧名思義:就是全文檢索的對象,它可能是一段話,也可能是一片文章,它可能是一個文件比如:word,txt也能是任意一種擴展名結尾的文件
檢索
描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時根據建立的索引查找,類似于通過字典的檢索字表查字的過程。
sphinx定義
Sphinx是一個基于SQL的全文檢索引擎,可以結合 MySQL,PostgreSQL做全文搜索,它可以提供比數據庫本身更專業的搜索功能,使得應用程序更容易實現專業化的全文檢索。Sphinx特別為一些腳本語言設計搜索API接口,如PHP,Python,Perl,Ruby等,同時為MySQL也設計了一個存儲引擎插件。
sphinx特點
Sphinx 單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創建索引的速度為:創建100萬條記錄的索引只需 3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒
sphinx搜索引擎架構圖
coreseek定義
Coreseek為應用提供全文檢索功能,目前的版本(2.x 3.x)基于Sphinx ,支持使用Python定義數據源,支持中文分詞。這說明coreseek集合了sphinx的功能,支持更多的數據源,在字典,建立索引,分詞更好的支持中文。可以這樣理解,coreseek就是支持中文的sphinx全文檢索
coreseek數據源
顧名思義:數據源就是為全文檢索提供索引數據的源頭,coreseek包括但不限制以下三種數據源
l xml
l mysql
l python
coreseek為了擴展,增加了python數據源功能,從而得以無限擴展 Coreseek/Sphinx的數據獲取功能因為Python目前具備操作所有類型數據庫的能力,從而coreseek也可以從任意一種數據庫之中獲取數據;當然,也支持從Python可以操作的任意其他數據來源獲取數據。
不同的數據源生成索引配置不一樣,但是他們都是為生成索引提供數據的
sphinx原理
生成詞典
詞庫是以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數據源數據舉例,當我們生成完索引進行搜索:
以“小明紅”進行搜索時候,關鍵字會先根據詞庫拆分,默認咱們以上面第二中分詞格式,拆分的得到的詞為“小”,“紅”,“明”,然后以拆分的詞在索引表里查詢數據,得到的結果是
sphinx基本工作流程
過濾關鍵詞
為關鍵詞過濾一些特殊字符,通過sphinxAPI自帶方法,結合字典把關鍵詞進行分詞,并且過濾一些特殊字符,過濾后在把拆分的詞再拼接起來進行檢索,例如:百度搜索
百度會自動把@&特殊字符過濾掉,再進行搜索,從而不影響搜索結果
設置filter
sphinx索引里的兩種字段
在sphinx里有兩種字段,一種可以理解為屬性字段,一種可以理解為索引字段,屬性字段就是以數值形式存儲在索引數據里的字段,它包括不能用來索引,這種類型的字段一般都是用來設置filter、以及做排序,還有一種全文檢索字段就是以字符形式存儲在索引數據里,這種類型的字段一般都用來進行分詞,例如文章內容,文章標題,等以字符形式存在的數據。下面就是索引里字段的介紹
Coreseek索引配置:
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字段存在搜索的關鍵字,第二條數據body存在搜索的關鍵字,設置權重排序,因為我們為字段name設置權重高,排序第一條數據要優先于第二條數據
設置排序
sphinx默認提供6種排序方式,具體請查看相關資料,在這里我給大家介紹按一種類似SQL的方式將列組合起來,升序或降序排列,方式
@weight DESC,content_hit desc,@id ASC
加入“@”代表此字段是sphinx提供的字段,不加“@”代表是數據源提供的字段,上面一句代碼的意思是:
先按照權重進行倒序,然后按照其他數據源提供的字段排序,這里用到的數據源字段 都是索引里的屬性字段,屬性字段上面已經和大家說過了。
設置搜索表達式
我們可以設置關鍵字在索引里每一個全文檢索字段里進行查找,也可以針對某一個全文檢索字段查找。例:
1、Query($keyword,$index,true);
2、Query("@name ({$keyword})",$index,true);
返回索引查詢得到的ID數組
query執行后,檢索完成,sphinx會為我們返回數組形式的值,值不僅包括搜索的一些相關信息,如果搜索到數據還會返回以二維數組形式存在的數據,二維數據包括 ID 對應數據源里數據的唯一標示字段(如 主鍵ID),以及一些索引里存儲的屬性字段
查詢數據庫
通過上面得到的二維數據,獲得ID,通過它可以在數據源查詢對應的相關信息
給查詢出來的數據高亮顯示
查詢出相關信息,為相關信息中的關鍵字進行高亮處理
. 應用
搜索引擎
百度、谷歌等搜索引擎
隨著網民對互聯網的需求越來越多,網民查看新聞、信息的方式發生轉變,搜索引擎的出現,改變了網民網上查看新聞、信息的瀏覽習慣。試想當不存在搜索引擎當不存在全文檢索,我們在網上查找東西是多么費事的一件事情啊!
智能機器人
全文檢索為智能化的推進提供了優秀的解決方案,智能機器人的出現在WEB,電視,手機等領域已經廣泛應用。
來自:http://blog.csdn.net/websites/article/details/36626573