您的位置:首页 > 运维架构 > Shell

[shell]实现快速更新sphinx索引库文件

2011-09-15 15:32 141 查看
随着基础词典和数据库内容的容量的增长,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 快速更新索引库
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: