Sphinx全文檢索之PHP使用教程


一、Sphinx簡介

1. Sphinx是什么?

中文名:全文索引引擎。只支持英文和俄文。但是只要有相應的語言包也可支持任何語言。國內有一團隊在Sphinx基礎上封裝了一個帶中文包的軟件:coreseek。

2. 為什么要用Sphinx?

在mysql數據庫中,對於如下sql語句,select * from xxx where like xxx '%xxx'; (以%開頭的like查詢),無法使用到任何索引優化,導致如果數據量非常大,查詢速度會非常慢。而這種sql語句在很多功能中都要用到,如根據歌詞查詢歌曲,根據劇情查詢電影等。如果要加快查詢只能使用第三方軟件,Sphinxlucence。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服務的情況下合並。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM