當(dāng)一個(gè)功能需要對(duì)表中的text varchar等文本進(jìn)行l(wèi)ike查詢時(shí),MySQL全表掃描很慢额嘿,需要sphinx
1.解決性能問(wèn)題
2.解決中文分詞問(wèn)題
流程:
1.PHP先把要搜索的短語(yǔ)發(fā)給sphinx服務(wù)器,sphinx服務(wù)器返回的是記錄的ID
2.PHP用sphinx返回的ID查詢數(shù)據(jù)庫(kù)
用法一:sphinxse:把sphinx集成到MSQL里去径簿,沒(méi)有單獨(dú)的sphinx服務(wù)器
PHP只需要寫(xiě)一個(gè)sql語(yǔ)句即可疲憋,不用用戶管sphinx,mysql會(huì)自己連接查詢sphinx笼呆。如果要使用這種,需要在linux下重新編譯mysql旨别,把sphinx當(dāng)成插件編譯到mysql中去诗赌。
實(shí)際操作:
1.先下載sphinx的包,我們下載的是coreseek【coreseek.cn
2:coreseek是一個(gè)加了中文的sphinx
3:下載包之后幾個(gè)重要文件說(shuō)明
實(shí)際應(yīng)用:將etc文件夾下的csft_mysql.conf秸弛,即先復(fù)制mysql的配置文件模板到根目錄下铭若,并改名為sphinx.conf
以下sql語(yǔ)句要學(xué)習(xí)下寫(xiě)的不錯(cuò)
配置文件配置好之后就可以使用這個(gè)文件生成索引了
#MySQL數(shù)據(jù)源配置,詳情請(qǐng)查看:http://www.coreseek.cn/products-install/mysql/
#請(qǐng)先將var/test/documents.sql導(dǎo)入數(shù)據(jù)庫(kù)递览,并配置好以下的MySQL用戶密碼數(shù)據(jù)庫(kù)
#源定義
#配置數(shù)據(jù)源(要生成索引的數(shù)據(jù))
#說(shuō)明:一個(gè)配置文件中可以定義多個(gè)數(shù)據(jù)源
source goods
{
type= mysql
sql_host= localhost
sql_user= rumble
sql_pass= lumingzhe
sql_db= ushopdata
sql_port= 3306
#sphinx在取數(shù)據(jù)之前執(zhí)行的sql語(yǔ)句一般是設(shè)置編碼的語(yǔ)句set names編碼
sql_query_pre= SET NAMES utf8
#一個(gè)數(shù)據(jù)源中只能有一個(gè)主查詢叼屠,這條語(yǔ)句取出的數(shù)據(jù)就是sphin將要?jiǎng)?chuàng)建全文索引的語(yǔ)句
#主查詢的要求:第一個(gè)字段必須是ID,如果名字不為ID绞铃,取個(gè)別名叫id(類型必須是非零唯一镜雨、不重復(fù)的整數(shù))
#sphinx只能對(duì)屬性字段排序,sphinx要排序的字段必須取出該字段儿捧,sphin排序必須將某個(gè)字段定義成一個(gè)屬性
sql_query= SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title,content FROM documents
#sql_query第一列id需為整數(shù)
#后面這些可以不用
#title荚坞、content作為字符串/文本字段挑宠,被全文索引
#以下是用來(lái)定義屬性:用來(lái)排序的sql_attr_uint可以定義多個(gè)比如我要對(duì)價(jià)格上架時(shí)間
#進(jìn)行排序可以這樣操作sql_attr_uint=shop_pricesql_attr_uint=add_time
sql_attr_uint= group_id#從SQL讀取到的值必須為整數(shù)
sql_attr_timestamp=date_added #從SQL讀取到的值必須為整數(shù),作為時(shí)間屬性
sql_query_info_pre= SETNAMES utf8#命令行查詢時(shí)西剥,設(shè)置正確的字符集
sql_query_info= SELECT* FROM documents WHERE id=$id #命令行查詢時(shí),從數(shù)據(jù)庫(kù)讀取原始數(shù)據(jù)信息
}
#index定義
#配置索引--》生成的索引文件
#說(shuō)明:一個(gè)數(shù)據(jù)源對(duì)應(yīng)一個(gè)索引的配置
index goods_index
{
source=goods#對(duì)應(yīng)的source名稱
#sphinx生成的索引文件存放的目錄
#注意:path中的地址的最后一個(gè)即data后面的goods是說(shuō):索引文件名叫g(shù)oods
#并不是說(shuō)goods目錄
path= D:\D_E\coreseek-4.1-win32\var\data\goods
#var/data/mysql #請(qǐng)修改為實(shí)際使用的絕對(duì)路徑亿汞,例如:/usr/local/coreseek/var/...
docinfo= extern
mlock= 0
morphology= none
#允許最短的詞
min_word_len= 1
html_strip= 0
#中文分詞配置瞭空,詳情請(qǐng)查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux環(huán)境下設(shè)置疗我,/符號(hào)結(jié)尾
#中文詞庫(kù)在哪中文詞庫(kù)所在的目錄
charset_dictpath =D:\D_E\coreseek-4.1-win32\etc
#Windows環(huán)境下設(shè)置咆畏,/符號(hào)結(jié)尾,最好給出絕對(duì)路徑吴裤,例如:C:/usr/local/coreseek/etc/...
charset_type= zh_cn.utf-8
}
#全局index定義
#目前sphin只支持utf8編碼
#允許使用多大的內(nèi)存創(chuàng)建索引文件(indexer.exe這個(gè)命令可以使用的內(nèi)存)
indexer
{
mem_limit= 128M
}
#searchd服務(wù)定義
searchd
{
listen=9312
read_timeout= 5
max_children= 30
#最大返回的記錄數(shù)(即使查詢出的記錄數(shù)量更多也只返回設(shè)置的數(shù))
max_matches= 1000
seamless_rotate= 0
preopen_indexes= 0
unlink_old= 1
#以下三個(gè)一定要配置旧找,不配置無(wú)法用
pid_file =D:\D_E\coreseek-4.1-win32\var\log\searchd_mysql.pid
#var/log/searchd_mysql.pid
log =D:\D_E\coreseek-4.1-win32\var\log\searchd_mysql.log
#var/log/searchd_mysql.log
query_log =D:\D_E\coreseek-4.1-win32\var\log\query_mysql.log
#var/log/query_mysql.log
#請(qǐng)修改為實(shí)際使用的絕對(duì)路徑,例如:/usr/local/coreseek/var/...
binlog_path =#關(guān)閉binlog日志
}
說(shuō)明:indexer.exe命令所在地址–c配置文件所在地址指定生成索引的數(shù)據(jù)源【比如goods】或者–all【即為所有的數(shù)據(jù)源生成索引】
4:?jiǎn)?dòng)sphinx服務(wù)器
補(bǔ)充:sphinx服務(wù)刪除
引入sphinx的api的php操作的包這下就可以對(duì)中文進(jìn)行全文索引了
Sphinx自動(dòng)更新
實(shí)際操作:
1:每次生成索引文件之后要把最后一條記錄的ID保存下來(lái)麦牺,下次ID大于這個(gè)ID的就是最新的數(shù)據(jù)钮蛛。
2:建一張表用來(lái)保存這個(gè)id
3:
4:配置sphinx讓每次生成索引之后能夠直接把最大的ID更新進(jìn)來(lái)
定期為新添加的數(shù)據(jù)生成索引
A:修改sphinx定義一個(gè)新的數(shù)據(jù)源(新插入的數(shù)據(jù)還沒(méi)有創(chuàng)建索引)
B:再添加一個(gè)index索引(每個(gè)數(shù)據(jù)源對(duì)應(yīng)一個(gè)索引文件)
C:寫(xiě)一個(gè)bat腳本,讓這個(gè)定期用新的數(shù)據(jù)源生成索引文件剖膳,并把這個(gè)索引文件合并到主索引文件上(第一次生成的索引文件)
D:配置Windows系統(tǒng)讓系統(tǒng)定期執(zhí)行這個(gè)bat腳本即可