【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装
我們已經(jīng)知道m(xù)ysql中帶有"%keyword%"條件的sql是不走索引的,而不走索引的sql在大數(shù)據(jù)量+大并發(fā)量的時(shí)候,不僅效率極慢還很有可能讓數(shù)據(jù)庫崩潰.那我們?nèi)绾瓮ㄟ^某些關(guān)鍵字來搜索我們想要的文章呢? 雖然mysql的MYISAM提供全文索引,但是只支持中文,并且性能卻不敢讓人恭維,因此采用Sphinx來做mysql的全文索引工具是一個(gè)很好的選擇.
簡介
Sphinx是由俄羅斯人Andrew Aksyonoff開發(fā)的一個(gè)全文檢索引擎。意圖為其他應(yīng)用提供高速、低空間占用、高結(jié)果 相關(guān)度的全文搜索功能。Sphinx可以非常容易的與SQL數(shù)據(jù)庫和腳本語言集成。當(dāng)前系統(tǒng)內(nèi)置MySQL和PostgreSQL 數(shù)據(jù)庫數(shù)據(jù)源的支持,也支持從標(biāo)準(zhǔn)輸入讀取特定格式的XML數(shù)據(jù).
- 高速的建立索引(在當(dāng)代CPU上,峰值性能可達(dá)到10 MB/秒);
- 高性能的搜索(在2 – 4GB 的文本數(shù)據(jù)上,平均每次檢索響應(yīng)時(shí)間小于0.1秒);
- 可處理海量數(shù)據(jù)(目前已知可以處理超過100 GB的文本數(shù)據(jù), 在單一CPU的系統(tǒng)上可 處理100 M 文檔);
- 提供了優(yōu)秀的相關(guān)度算法,基于短語相似度和統(tǒng)計(jì)(BM25)的復(fù)合Ranking方法;
- 支持分布式搜索;
- 支持短語搜索
- 提供文檔摘要生成
- 可作為MySQL的存儲引擎提供搜索服務(wù);
- 支持布爾、短語、詞語相似度等多種檢索模式;
- 文檔支持多個(gè)全文檢索字段(最大不超過32個(gè));
- 文檔支持多個(gè)額外的屬性信息(例如:分組信息,時(shí)間戳等);
- 支持?jǐn)嘣~;
sphinx的安裝與使用
安裝
wget http://sphinxsearch.com/files/sphinx-2.2.9-release.tar.gz
tar zxvf sphinx-2.2.9-release.tar.gz
cd sphinx-2.2.9-release
./configure --prefix=/usr/local/sphinx/ --with-mysql=/usr/bin/mysql/
make && make install --prefix:指定 sphinx 的安裝路徑
--with-mysql:指定 mysql 安裝路徑,注意這里的安裝路徑一般是指通過編譯安裝的mysql路徑,如果你是通過yum來安裝的mysql的話,此項(xiàng)可以不用加
make的時(shí)候,有可能會報(bào)錯(cuò),不要管,繼續(xù)等待.如果最終失敗的話,再make clean之后,刪除目錄,重新configure.
注意,此時(shí)的sphinx還不能支持中文
安裝成功后,按道理應(yīng)該有三個(gè)工具
ls /usr/local/sphinx/bin
indexer 創(chuàng)建索引命令
searchd 啟動進(jìn)程命令
search 命令行搜索命令 其中search命令已經(jīng)在新版本的sphinx取消了,可以用api文件來進(jìn)行測試;
配置與使用
cd /usr/local/sphinx/etc
ls
example.sql # 示例sql
sphinx.conf.dist # 完整版配置項(xiàng)
sphinx-min.conf.dist # 精簡版配置項(xiàng)cp sphinx.conf.dist sphinx.conf
vim sphinx.conf # 配置數(shù)據(jù)庫連接信息,打開utf8字符集注釋(sql_query_pre = SET NAMES utf8),然后可以把以上的示例sql導(dǎo)入數(shù)據(jù)庫里面做測試;cd /usr/local/sphinx/bin./indexer --all # 創(chuàng)建索引,如果后面又新增加了數(shù)據(jù),還要重新或增量建立sql; ./search this #搜索test庫中有this的;注意,在新版本的sphinx里面該命令已經(jīng)被取消了,但可以通過api文件來測試$ cd sphinx/api
$ php test.php test 如果執(zhí)行indexer命令報(bào)錯(cuò)
ERROR: index 'test1stemmed': sql_connect: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 則可能是因?yàn)閙ysql.sock的位置問題,在本機(jī)中,該位置是/tmp/mysql.sock(與安裝mysql時(shí)設(shè)置有關(guān)),在sphinx.conf中取消這一行的注釋即可(去掉前面的#號):
#sql_sock = /tmp/mysql.sock 然而以上的所有步驟都沒有什么卵用,因?yàn)閟phinx是不支持中文的,所以我們可以選擇使用基于sphinx的coreseek,也可以選擇其他更方便的擴(kuò)展,本文就先結(jié)束coreseek
coreseek
安裝
安裝mmseg
wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz
tar zxvf coreseek-4.1-beta.tar.gz
cd coreseek-4.1-beta
ls
csft-4.1 #sphinx中文擴(kuò)展
mmseg-3.2.14 #中文詞庫
testpack #先安裝mmseg中文分詞系統(tǒng)
cd mmseg-3.2.14/
./configure --prefix=/usr/local/mmseg 如果報(bào)錯(cuò) annot find input file: src/Makefile.in
就依次執(zhí)行:
aclocal #是一個(gè)perl 腳本程序,它的定義是:“aclocal - create aclocal.m4 by scanning configure.ac” ,如果執(zhí)行此句還是錯(cuò)誤的話就 yum -y install libtool
libtoolize --force
automake --add-missing
autoconf
autoheader
make clean#然后再從新編譯一下
./configure --prefix=/usr/local/mmseg
make && make intall 測試
$ /usr/local/mmseg/bin/mmseg -d /usr/local/mmseg/etc /usr/src/coreseek-4.1-beta/mmseg-3.2.14/src/t1.txt
中文/x 分/x 詞/x 測試/x
中國人/x 上海市/x$ ./mmseg -d ../etc test.txt
小/x 白兔/x 白/x 又/x 白/x 兩/x 只/x 耳朵/x 豎/x 起來/x
愛/x 吃/x 蘿卜/x 愛/x 吃/x 菜/x 安裝csft-4.1
cd /usr/src/coreseek-4.1-beta/csft-4.1
sh buildconf.sh # 如果不報(bào)錯(cuò)就代表沒問題,如果輸出的warning信息可以忽略,如果出現(xiàn)error則需要解決 ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg/lib/ --with-mysql
make && make install 配置
配置文件
- 名為main的主數(shù)據(jù)源:source main{}
- 繼承名為main的增量數(shù)據(jù)源:source delta:main{}
- 名為main的主索引:index main{}
- 繼承名為main的增量索引:index delta:main{}
- 分布式索引:index dist1{}
- 索引器:indexer{}
- 服務(wù)進(jìn)程:searchd{}
增量配置肯定是要做的,所以先準(zhǔn)備一個(gè)計(jì)數(shù)器
-- 只記錄一行數(shù)據(jù)
CREATE TABLE sph_counter
(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
); #MySQL數(shù)據(jù)源配置,詳情請查看:http://www.coreseek.cn/products-install/mysql/cd /etc
cp sphinx.conf.dist csft.conf #復(fù)制為csft名后就可以自動讀取#主數(shù)據(jù)源
source main
{type = mysqlsql_host = localhostsql_user = rootsql_pass = 123456sql_db = testsql_port = 3306sql_query_pre = SET NAMES utf8 sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company;#通過replace into語句記錄每次建立數(shù)據(jù)源最后一條數(shù)據(jù)id;sql_query = SELECT * FROM hr_spider_company WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) sql_attr_uint = id #從SQL讀取到的值必須為整數(shù) sql_attr_uint = from_id #從SQL讀取到的值必須為整數(shù),不支持全文檢索 sql_attr_uint = link_id #從SQL讀取到的值必須為整數(shù),不支持全文檢索 sql_attr_uint = add_time #從SQL讀取到的值必須為整數(shù),不支持全文檢索 sql_field_string = link_url #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = company_name #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = type_name #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = trade_name #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = email #字符串字段(可全文搜索,可返回原始文本信息) sql_field_string = description #字符串字段(可全文搜索,可返回原始文本信息) sql_attr_timestamp = date_added #從SQL讀取到的值必須為時(shí)間戳,作為時(shí)間屬性sql_query_info_pre = SET NAMES utf8 #命令行查詢時(shí),設(shè)置正確的字符集sql_query_info = SELECT id,from_id,link_id,company_name,type_name,trade_name,address,description, FROM_UNIXTIME(add_time) AS add_time FROM hr_spider_company WHERE id=$id #用于PHP-CLI命令行查詢時(shí),從數(shù)據(jù)庫讀取原始數(shù)據(jù)信息 #區(qū)段查詢 每次查詢一段數(shù)據(jù)來建立索引#sql_query_range = SELECT MIN(id),MAX(id) FROM documents#sql_range_step = 1000#sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end
}#主數(shù)據(jù)索引
index main
{source = main #對應(yīng)的source名稱path = /usr/local/coreseek/var/data/main #主數(shù)據(jù)索引存儲路徑及其名稱docinfo = externcharset_type = zh_cn.utf-8min_word_len = 1 #索引詞最小長度 min_prefix_len = 0 #最小索引前綴長度 min_infix_len = 1 #最小索引中綴長度ngram_len = 1 #對于非字母型數(shù)據(jù)的長度切割(for CJK indexing) charset_dictpath = /usr/local/mmseg/etc/ #分詞的詞典路徑,BSD、Linux環(huán)境下設(shè)置,/符號結(jié)尾html_strip = 0 #是否去除用戶輸入查詢內(nèi)容的html標(biāo)簽
}#增量數(shù)據(jù)源
source delta : main
{ sql_query_pre = SET NAMES utf8 sql_query = SELECT * FROM hr_spider_company WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )sql_query_post_index = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM hr_spider_company
} #增量數(shù)據(jù)索引
index delta : main
{ source = delta path = /usr/local/coreseek/var/data/delta
}source src1throttled : src1
{sql_ranged_throttle = 100
}#全局index定義
indexer
{mem_limit = 128M #內(nèi)存大小限制 默認(rèn)是 32M, 最大 2047M, 推薦為 256M 到 1024M之間
}#searchd服務(wù)定義
searchd
{# 監(jiān)測端口及形式,一下幾種均可,默認(rèn)為本機(jī)9312端口 # listen = 127.0.0.1 # listen = 192.168.0.1:9312 # listen = 9312 # listen = /var/run/searchd.socklisten = 9312 read_timeout = 5 # 讀取超時(shí)時(shí)間 max_children = 30 # searche進(jìn)程的最大運(yùn)行數(shù) max_matches = 1000 # 最大的查詢結(jié)果返回?cái)?shù) seamless_rotate = 1 # 是否支持無縫切換(做增量索引時(shí)需要) preopen_indexes = 0 # 在啟動運(yùn)行時(shí)是否提前加載所有索引文件 unlink_old = 1 # 是否釋放舊的索引文件pid_file = /usr/local/coreseek/var/log/searchd.pid log = /usr/local/coreseek/var/log/searchd.log # search進(jìn)程的日志路徑 query_log = /usr/local/coreseek/var/log/query.log # 查詢?nèi)罩镜刂?binlog_path = #關(guān)閉binlog日志
} 測試
cd /usr/local/coreseek/bin
./search 淘寶 使用 sphinx 需要做以下幾件事
1.有數(shù)據(jù);
2.建立 sphinx 配置文件;
3.生成索引;
4.啟動 searchd 服務(wù)進(jìn)程,默認(rèn)是9312
5.用 PHP 去連接 sphinx 服務(wù)
#啟動服務(wù),監(jiān)聽9312端口
cd /usr/local/coreseek/bin/
./searchd
#./searchd -c /usr/local/coreseek/etc/csft_mysql.conf #如果配置文件不是默認(rèn)的csft.conf的話# 執(zhí)行索引(查詢、測試前必須執(zhí)行一次)
./indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate # 執(zhí)行增量索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate # 合并索引
/usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0 #為了防止多個(gè)關(guān)鍵字指向同一個(gè)文檔加上--merge-dst-range deleted 0 0# 后臺服務(wù)測試
/usr/local/coreseek/bin/search -c /usr/local/coreseek/etc/csft_mysql.conf aaa #關(guān)閉后臺服務(wù)
/usr/local/coreseek/bin/searchd -c /usr/local/coreseek/etc/csft_mysql.conf --stop searchd 命令參數(shù)介紹:
- -c 指定配置文件
- --stop 停止服務(wù)
- --pidfile 用來顯式指定一個(gè) PID 文件
- -p 指定端口
自動化建立索引
# 每分鐘進(jìn)行一次增量索引
*/1 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf delta --rotate # 每五分鐘合并一次索引
*/5 * * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --merge main delta --rotate --merge-dst-range deleted 0 0 # 每天晚上的一點(diǎn)三十分建一次完整的索引
30 1 * * * /bin/sh /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft_mysql.conf --all --rotate 參考
Sphinx中文指南
sphinx全文檢索之PHP使用教程
coreseek-4.1 參考手冊
coreseek-4.1的一些配置說明(左側(cè)邊欄)
Sphinx PHP擴(kuò)展(類)使用說明
sphinx中文版Coreseek中文檢索引擎安裝和使用方法(Linux)
轉(zhuǎn)載于:https://www.cnblogs.com/nixi8/p/4746179.html
總結(jié)
以上是生活随笔為你收集整理的【PHP高效搜索专题(1)】sphinxCoreseek的介绍与安装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不孕不育吃中药
- 下一篇: 刘翔也结婚了,对此你想说点啥?