sphinx 增量索引

来源:互联网 发布:淘宝客服是什么工作 编辑:程序博客网 时间:2024/05/17 00:52

Sphinx 实时索引数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到主索引+增量索引的思路来解决,这个模式实现的基本原理是设置两个数据源和两个索引。1、创建一个计数器
在数据库中增加一个计数表,记录将文档集分为两个部分的文档
ID,每次重新构建主索引时,更新这个表
先在
mysql 中插入一个计数表
CREATE TABLE sph_counter( counter_id INT PRIMARY KEY, max_doc_id INT);
2
、再次修改配置文件
主数据源,继承数据源,主索引,继承索引。(继承索引也就是增量索引)。主数据源里面
:我们需要把欲查询语句改成下面的语句:
vi /usr/local/coreseek/etc/csft.conf
主数据源
Source main{
#
添加一个 sql_query_pre语句

Sphinx 资料

讲师:邹义良 http://www.weibo.com/it266

Sphinx 资料sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM post

#修改sql_query内容如下sql_query= \

SELECT id,title, content FROM post \

WHERE id<=(SELECT max_doc_id FROM sph_counter WHERE counter_id=1)}

讲师:邹义良 http://www.weibo.com/it266

增量数据源,继承自 main数据源,只需要重写main中的sql_query_presql_query项,并将默认的test1stemmed名字改为delta方便管理
增量数据源
source delta : main

{
sql_query_pre = SET NAMES utf8
sql_query= \
SELECT id,title, content FROM post \
WHERE id>(SELECT max_doc_id FROM sph_counter WHERE counter_id=1)
}
主索引不变
Index ind_main {
source = main
path = /usr/local/coreseek/var/data/main
}
增量索引,继承了 ind_main索引,并重写sourcepath
index ind_delta:ind_main
{
source= delta
path= /usr/local/coreseek/var/data/ind_delta
# distributed index
}
其它配置不用改变
注意
:如果你增量索引的source配置中只有id,content两项
而主索引的
source 配置中有 id, title,content三项,合并的时候会报属性数量不匹配,如:

Delta:sql_query = SELECT id, title,content FROM post

Main:sql_query=SELECT id,title,date,content FROM post

按照上面的配置 基本没有问题,容易遗漏的地方是在 php 程序里面,在query的时候没有把 增量索引 ind_delta 加入查询

    $result = $sp->query($keywords, 'ind_main,ind_delta');//第二个参数是索引名


实时更新索引
我们需要建立两个脚本,还要用到计划任务

建立一个主索引和增量索引的脚本

main.sh delta.sh在增量索引中写下delta.sh
vi /usr/local/coreseek/etc/delta.sh

#!/bin/bash
#delta.sh
/usr/local/coreseek/bin/indexer ind_delta >>/usr/local/coreseek/var/log/delta.log
主索引中写下:main.sh
vi /usr/local/coreseek/etc/main.sh

#!/bin/bash
#main.sh
/usr/local/coreseek/bin/indexer ind_main >>/usr/local/coreseek/var/log/main.log
最后,我们需要脚本能够自动运行,以实现增量索引每5 分钟重新建立,和主索引只在凌晨2:30 时重新建立.脚本写好了,我们需要建立计划任务
crontab -e
*/5 * * * * /usr/local/coreseek/etc/delta.sh
30 2 * * * /usr/local/coreseek/etc/main.sh
第一条是表示每 5分钟运行
第二条是表示每天的凌晨
2:30分运行
脚本权限
:
chmod a+x /usr/local/coreseek/etc/delta.sh
chmod a+x /usr/local/coreseek/etc/main.sh
要验证的话,我们可以查看日志文件


0 0