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

随着基础词典和数据库内容的容量的增长,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   快速更新索引库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yagas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值