[shell]实现快速更新sphinx索引库文件
2011-09-15 15:32
141 查看
随着基础词典和数据库内容的容量的增长,sphinx索引文件的生成时间也随之增长着。要实现在最短的时间内对sphinx索引文件的更新工作,看来只有在后台另外生成一份新的索引文件,完成之后再停止sphinx服务进行替换了。替换,就是将原来的索引文件重命名为别的文件,再将新生成的索引文件重命名为索引文件。原理就是:重命名的时间比删除大文件的时间短。所以可以实现对大文件进行“瞬间”更新。在最短的时间内重新更新和启动sphinx上线工作。
以下是我写的管理 Sphinx 服务的脚本:
配置文件 sphinx.conf 片段
配置文件 buffer.conf 片段
脚本的使用说明:
sphinx start 启动Sphinx服务
sphinx stop 停止Sphinx服务
sphinx indexer 停止服务并重新生成索引库
sphinx update 快速更新索引库
以下是我写的管理 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 快速更新索引库
相关文章推荐
- Shell实现自动更新目录名称与文件中版本号信息与时间戳
- web服务文件更新自动同步、数据库主从复制、shell脚本实现网站代码备份和mysql备份
- 利用SHELL脚本实现文件完整性检测程序(1.2版更新)
- shell中变量自增的实现方法 ----待更新
- Silverlight中用WCF实现文件快速上传(一、基本方法)
- Android中使用AsyncTask实现文件下载以及进度更新提示
- Android快速实现热更新
- shell小脚本实现上传目录中的所有文件到服务器
- shell脚本实现文件锁功能
- [ZZ] 使用rsync来实现快速删除大量文件
- APP自动更新功能的快速集成和实现方法讲解
- Android快速实现文件下载(只有4行代码)
- 简单SHELL脚本实现FTP上传文件
- 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面
- shell脚本实现nfs服务安装配置,共享文件分发
- Shell脚本实现删除一年前文件功能分享
- Shell脚本实现复制文件到多台服务器的代码分享
- Win7/Win8.1快速获得Win10更新升级文件推送步骤详解
- Shell脚本实现DB2数据库表导出到文件
- [C#]实现文件复制[更新]实时显示进度条