配置Sphinx(重要)
步驟1:創建youhua3數據庫
image.png
步驟2:將etc/csft_mysql.conf復制并更名為sphinx.conf
步驟3:復制下面代碼替換shpinx.conf中的內容(紅色-可能需要修改,綠色-存在對應關系)
#數據源:數據來源定義(數據庫信息、數據源SQL語句)
source music
{
#下面是sql數據庫特有的端口,用戶名,密碼,數據庫名等。
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = youhua3
sql_port = 3306
sql_query_pre = SET NAMES utf8
#sql_query屬性:取出要創建索引的數據
#要求1:SELECT的第一個字段必須是主鍵、
#要求2:第一個字段的名字(別名)必須是id
#要求3:其他的字段就是要創建索引的字段
#需 求:為歌曲表中的title和author和content字段創建索引
sql_query = SELECT id, title, author, content FROM music
}
#索引的定義(索引文件存放的位置,索引文件的名字)
#每個index對應一個數據源,用來定義這個數據源生成的索引文件的信息
index music
{
#該索引對應哪個數據源
source = music
#索引文件存放的目錄和名字(存到E:/sphinx/var/data/目錄下,索引文件的名字是music)
path = F:/www/sphinx/var/data/music
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#詞庫文件所在的目錄
charset_dictpath = F:/www/sphinx/etc/
#字符集編碼類型,可以為:(sbcs,utf-8,zh_cn.utf-8,zh_ch.gbk,zh_ch.big5)
charset_type = zh_cn.utf-8
}
#全局index定義
indexer
{
#建立索引的時候,索引內存限制
mem_limit = 128M
}
#searchd服務定義
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
# 進程id文件
pid_file = F:/www/sphinx/var/log/searchd_mysql.pid
# 系統日志存放的位置
log = F:/www/sphinx/var/log/searchd_mysql.log
# 查詢日志存放的位置
query_log = F:/www/sphinx/var/log/query_mysql.log
}
index music 創建music索引(和source一一對應,表示該索引通過哪些數據創建)
source music1 創建music數據源
創建索引
?創建指定索引語法:indexer.exe -c 配置文件 索引名
?創建全部索引語法:indexer.exe -c 配置文件 --all
image.png
使用PHP API操作 Sphinx
創建Sphinx服務
?創建服務:bin\searchd.exe -c 配置文件 --install
?刪除服務:sc delete 服務名
?啟動服務:net start 服務名
?關閉服務:net stop 服務名
image.png
2、初體驗(PHP操作Sphinx)
復制sphinx\api目錄中的接口文件sphinxapi.php放到站點目錄
在站點目錄創建test.php引入該文件
<?php
#步驟1:引入sphinx接口文件
require './sphinxapi.php';
#步驟2:實例化對象
$sp = new SphinxClient;
#步驟3:設置服務
$sp->SetServer('localhost', 9312);
#步驟4:
#步驟5:設置查詢條數
$sp->SetLimits(0, 5000);
#步驟6:發送查詢
$rs = $sp->query('冬天', 'music');
echo '<pre>';
print_r($rs);
匹配模式
?語法:$sp->SetMatchMode(常量)
SPH_MATCH_ALL 匹配所有詞(默認)
SPH_MATCH_ANY 匹配一個詞
SPH_MATCH_PHRASE 匹配整一個詞
SPH_MATCH_BOOLEAN 將查詢看作一個布爾表達式
SPH_MATCH_EXTENDED 查詢看做一個sphinx的表達式
?將查詢看作一個布爾表達式(SPH_MATCH_BOOLEAN)
說明:就是通過運算查詢
舉例:
$sp->query('冬天 !寒冷', 'music')
匹配冬天關鍵字,但是不能有寒冷
$sp->query('冬天 & 寒冷', 'music')
匹配冬天 并且有 寒冷(都要有)
$sp->query('冬天 | 寒冷', 'music')
匹配冬天或寒冷(只要有一個)
查詢看做一個sphinx的表達式(SPH_MATCH_EXTENDED)
說明:查詢指定字段的內容
舉例:@title 內容 @content 內容 @author 內容
練習:內容(content)字段=PHP
image.png
//例子
<?php
/*
?步驟1:通過sphinx去MySQL中獲取并建立索引文件
?步驟2:通過php去sphinx中查詢數據并返回ID
?步驟3:根據ID去MySQL中查詢具體數據
SPH_MATCH_ALL 匹配所有詞(默認)
SPH_MATCH_ANY 匹配一個詞
SPH_MATCH_PHRASE 匹配整一個詞
SPH_MATCH_BOOLEAN 將查詢看作一個布爾表達式
SPH_MATCH_EXTENDED 查詢看做一個sphinx的表達式
*/
require './api/sphinxapi.php';
$sp=new SphinxClient;
$sp->SetServer("localhost",9312);
$sp->SetMatchMode(SPH_MATCH_ALL);
//設置查詢的條數
$sp->SetLimits(0,10);
//發送查詢
$rs = $sp->query('我喜歡php', 'music');
$ids=array_keys($rs['matches']);
$id=implode(',',$ids);
$pdo=new PDO("mysql:dbname=youhua3",'root','root');
$rt=$pdo->query("select * from music where id in ({$id})");
$res=$rt->fetchAll(PDO::FETCH_ASSOC);
foreach($res as $k){
echo $k['id'].'<br>';
echo gl("我",gl("喜歡",gl('php',$k['title']))).'<br>';
echo gl("我",gl("喜歡",gl('php',$k['author']))).'<br>';
echo gl("我",gl("喜歡",gl('php',$k['content']))).'<br>';
}
/*代碼高亮*/
function gl($keywords,$content){
return str_replace($keywords,"<font color='red'>{$keywords}</font>",$content);
}
image.png