随着基础词典和数据库内容的容量的增长,sphinx索引文件的生成时间也随之增长着。要实现在最短的时间内对sphinx索引文件的更新工作,看来只有在后台另外生成一份新的索引文件,完成之后再停止sphinx服务进行替换了。替换,就是将原来的索引文件重命名为别的文件,再将新生成的索引文件重命名为索引文件。原理就是:重命名的时间比删除大文件的时间短。所以可以实现对大文件进行“瞬间”更新。在最短的时间内重新更新和启动sphinx上线工作。
以下是我写的管理 Sphinx 服务的脚本:
#!/bin/sh
#
# power by yagas60@21cn.com
# blog: http://blog.csdn.net/yagas
. /etc/rc.d/init.d/functions
appName="Sphinx"
coreseek_dir="/usr/local/coreseek/"
data_dir="${coreseek_dir}/var/data/"
config="${coreseek_dir}etc/sphinx.conf"
buffer="${coreseek_dir}etc/buffer.conf"
stop(){
echo -n {1}quot;Stoping $appName: "
/usr/local/bin/searchd -c ${config} --stop > /dev/null 2>&1
ret=$?
[ $ret -eq 0 ] && success||failure
echo
return $ret
}
start(){
echo -n {1}quot;Starting $appName: "
/usr/local/bin/searchd -c ${config} > /dev/null 2>&1
ret=$?
[ $ret -eq 0 ] && success||failure
echo
return $ret
}
indexer(){
echo -n {1}quot;$appName making index: "
/usr/local/bin/indexer -c ${config} --all > /dev/null 2>&1
ret=$?
[ $ret -eq 0 ] && success||failure
echo
return $ret
}
update(){
echo -n {1}quot;make ${appName} buffer index: "
/usr/local/bin/indexer -c ${buffer} --all > /dev/null 2>&1
ret=$?
[ $ret -eq 0 ] && success||failure
echo
return $ret
}
move(){
echo -n {1}quot;replace ${appName} index: "
ls $data_dir|grep buffer|awk -F _ '{system("mv '$data_dir'"$2" '$data_dir'"$2".bak");system("mv '$data_dir'"$0" '$data_dir'"$2)}' > /dev/null 2>&1
ret=$?
[ $ret -eq 0 ] && success||failure
rm -f ${data_dir}*.bak
echo
return $ret
}
case $1 in
indexer)
stop
indexer
start
;;
stop)
stop
;;
start)
start
;;
update)
update
stop
move
start
esac
exit 0
配置文件 sphinx.conf 片段
source main
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = forwins
sql_db = chinasc
sql_port = 3360
sql_query_pre = SET NAMES utf8
sql_sock = /var/lib/mysql/mysql.sock
}
source product_src : main
{
sql_query = \
SELECT id, title, memberid, groupid, IF( csc_member_recommend.exptime > UNIX_TIMESTAMP( ) , 1, 0 ) AS best, csc_company.areaid AS areaid, uptime, IF( csc_member_grade.exptime > UNIX_TIMESTAMP( ) , 1, 0 ) AS eshop FROM csc_products \
INNER JOIN csc_member USING ( memberid ) \
INNER JOIN csc_company USING ( memberid ) \
LEFT JOIN csc_member_recommend USING (memberid) \
LEFT JOIN csc_member_grade USING ( memberid ) \
WHERE csc_products.checked = 'Y'
sql_attr_uint = memberid
sql_attr_uint = groupid
sql_attr_uint = best
sql_attr_uint = areaid
sql_attr_uint = uptime
sql_attr_uint = eshop
sql_query_info = \
SELECT * FROM csc_products WHERE id=$id
}
index product
{
source = product_src
path = /usr/local/coreseek/var/data/product
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = /usr/local/coreseek/dict/product/
charset_type = zh_cn.utf-8
}
配置文件 buffer.conf 片段
source main
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = forwins
sql_db = chinasc
sql_port = 3360
sql_query_pre = SET NAMES utf8
sql_sock = /var/lib/mysql/mysql.sock
}
source product_src : main
{
sql_query = \
SELECT id, title, memberid, groupid, IF( csc_member_recommend.exptime > UNIX_TIMESTAMP( ) , 1, 0 ) AS best, csc_company.areaid AS areaid, uptime, IF( csc_member_grade.exptime > UNIX_TIMESTAMP( ) , 1, 0 ) AS eshop FROM csc_products \
INNER JOIN csc_member USING ( memberid ) \
INNER JOIN csc_company USING ( memberid ) \
LEFT JOIN csc_member_recommend USING (memberid) \
LEFT JOIN csc_member_grade USING ( memberid ) \
WHERE csc_products.checked = 'Y'
sql_attr_uint = memberid
sql_attr_uint = groupid
sql_attr_uint = best
sql_attr_uint = areaid
sql_attr_uint = uptime
sql_attr_uint = eshop
sql_query_info = \
SELECT * FROM csc_products WHERE id=$id
}
index product
{
source = product_src
path = /usr/local/coreseek/var/data/buffer_product
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
charset_dictpath = /usr/local/coreseek/dict/product/
charset_type = zh_cn.utf-8
}
脚本的使用说明:
sphinx start 启动Sphinx服务
sphinx stop 停止Sphinx服务
sphinx indexer 停止服务并重新生成索引库
sphinx update 快速更新索引库