一、Sphinx簡介
1. Sphinx是什么?
中文名:全文索引引擎。只支持英文和俄文。但是只要有相應的語言包也可支持任何語言。國內有一團隊在Sphinx基礎上封裝了一個帶中文包的軟件:coreseek。
2. 為什么要用Sphinx?
在mysql數據庫中,對於如下sql語句,select * from xxx where like xxx '%xxx'; (以%開頭的like查詢),無法使用到任何索引優化,導致如果數據量非常大,查詢速度會非常慢。而這種sql語句在很多功能中都要用到,如根據歌詞查詢歌曲,根據劇情查詢電影等。如果要加快查詢只能使用第三方軟件,Sphinx和lucence。mysql中也提供了全文索引的功能,但是有兩個問題:(1)只有myisam引擎支持(2)對中文支持不好。不過現在最新的mysql5.6版本中的innodb1.2的版本也同樣支持全文索引。
3. Sphinx的使用原理
(1)先創建數據源。
(2)根據數據源創建索引,使用分詞技術。
(3)php把查詢的關鍵詞給Sphinx服務器,Sphinx根據關鍵詞查找到關鍵字在mysql表里面的記錄的id.Sphinx把id返回給php查詢端。
(4)php根據返回的id,查詢mysql服務器。
二、安裝使用
1. 下載,進行解壓
官網下載:http://www.Sphinxsearch.com
支持中文分詞:http://www.coreseek.com
解壓后拷貝到指定的目錄,一般和其他的環境程序在同一級目錄(便於管理)
2. 拷貝配置文件
把etc目錄下面的csft_mysql.conf文件拷貝到上一級目錄,並改名為sphinx.conf
三、使用配置
1. 對查詢數據創建索引
主要是配置sphinx.conf配置文件
(1)配置數據源(被查詢的數據,就是sql語句執行的結果)
配置語法:
source 數據源名稱 {
}
注意:在一個配置文件中,可以配置多個數據源。
(2)配置數據源生成的索引文件存放的位置。
配置語法:
index 索引的名字 {
}
注意:該索引必須與一個數據源相對應。
(3)配置Sphinx服務器的信息
2. 創建索引
執行Sphinx下的一個程序 indexer.exe –c 配置文件(全路徑) --all | 索引的名字 (--all:為配置文件中所有的索引創建索引文件。也可以使用索引的名字只為某一個索引創建索引文件)
(1)以管理員的方式打開cmd窗口,執行indexer.exe命令。
(2)查看創建的索引文件。
3. 啟動Sphinx服務器
(1)把Sphinx軟件安裝為一個系統一個服務。
語法:searchd.exe –c 配置文件 --install
可以通過 searchd --help 查看幫助
(2)啟動該服務。
查看端口是否啟動:
4. 通過php查詢使用
(1)在php使用中,需要一個Sphinx的一個接口文件。
使用Sphinx時,需要把sphinxapi.php文件拷貝到項目中來即可。
(2)代碼如下。
require 'sphinxapi.php'; // 使用Sphinx來完成查詢 $sc = new SphinxClient(); // 生成客戶端 $sc->setServer('localhost', 9312); // 設置服務器 // $sc->query('查詢的關鍵詞', 索引文件的名稱); $keyword="電影"; $indexname ='movie'; $res = $sc->query($keyword,$indexname); $ids = $res['matches']; $id = array_keys($ids); $id = implode(',',$id); mysql_connect("localhost",'root','root'); mysql_query('use php'); mysql_query('SET NAMES UTF8'); $sql="select id,title,description from movie where id in($id)"; $res = mysql_query($sql); $list=array(); while($row=mysql_fetch_assoc($res)){ $list[]=$row; } foreach($list as $v){ echo $v['title'].'<br/>'.$v['description'].'<hr>'; }
四、匹配模式
1. SPH_MATCH_ALL:完全匹配所有的詞
如“冬天 的 雪”,並不會匹配 “我愛冬天”,但可以匹配 “我的朋友,愛冬天,和雪”。
因為“冬天的雪” 被分成 “冬天”,“的”,“雪”三個詞,匹配條件是同時包含這三個詞,“我愛冬天”里只包含一個“冬天”
2. SPH_MATCH_PHRASE:必須匹配整個短語
如“冬天的雪”,不會匹配 “我的朋友,愛冬天,和雪”,雖然都包含同樣的需要嚴格匹配不再健忘,只匹配“冬天的雪”
3. SPH_MATCH_ANY:匹配任意一個詞
如“冬天 的 雪”,並會匹配 “我愛冬天”。
"冬天的雪“ -》 ”冬天“ ”的“ ”雪“
因為“我愛冬天”里有一個“冬天”相匹配。
4. SPH_MATCH_EXTENDED:支持一些擴展的語法
支持 @字段 查詢
如,查詢title包含 abc , content 包含 bcd的:
'@title abc @content bcd'
SPH_MATCH_BOOLEAN:與,或,非,分組 &,or,!,()
如:hello | world
查詢“手機”,或“冬天”
五、查到得關鍵詞添加樣式顯示
主要使用:buildExcerpts:創建文檔摘要,對關鍵詞添加樣式顯示。
六、增加索引
1. 增量索引的原理
2. 實現方式
(1)新建一張表,記錄一下上次已經創建好索引的最后一條記錄的id
(2)當索引時,然后從數據庫中取出所有大於id的數據,這些就是新的數據然后創建一個小的索引文件。
(3)把增量這部分數據生成的小的索引合並到主索引文件上去。
(4)把最后一條記錄的id更新到第一步創建的表中。
3. 實現步驟
(1)創建一個表,用於記錄創建好索引的最后一條記錄的id
(2)修改Sphinx的配置文件,主索引的數據源
(3)創建增量索引的數據源,以及增量索引文件存儲的位置
4. 把Sphinx的服務器停止,並刪除原來的索引文件。
(1)創建主索引
(2)查看a表里面是否記錄最大的id
5. 啟動Sphinx的服務器,進行查詢測試。
6. 添加一部新的電影。
7. 創建增量索引。
8. 把創建的增量索引合並到主索引里面。
使用的語法:indexer -c 配置文件 --merge 主索引文件 增量索引文件 --rotate --rotate 強制合並,可以不關閉Sphinx服務的情況下合並。