关闭

sphinx增量索引

标签: coreseeksphinx增量索引
170人阅读 评论(0) 收藏 举报
分类:

当我们第一次使用indexer为表中内容建立索引后,当前表中内容都可以通过sphinxapi查询到。但是,当我们增加记录后,sphinx还未为增加的记录建立索引;修改记录后,应该为修改后记录重新建立索引;删除记录后,应该从索引文件中将该记录删除。以下,本文分别介绍这三种情况的处理方法。

增加记录

我们可以建立一张表,专门用于存放已经建立索引的最大主键id值;比如:第一次建立索引后,记录数据库表中最大id为max_id=100,当向数据库中添加10条新纪录后,数据库表中最大主键id变为了110。因此,我们只需要为大于max_id的这10条记录建立索引。
为此,我们可以再配置一个数据源和一个索引,定期执行,用于为新增记录建立索引。

新加一个表:

//记录已更新记录的最大id
create table rain_newszl
(
 max_id int unsigned
);

增量数据源和索引定义

#新闻增量数据源
source news_zl
{
	type			= mysql
	sql_host		=localhost
	sql_user		=root
	sql_pass		=root
	sql_db			=rain
	sql_port		=3306
	sql_query_pre	=SET NAMES utf8

	#从数据库表查询id大于max_id的记录,以及修改记录表rain_newsupdate中所有记录,为其建立索引
	sql_query		= select id,title,content from rain_news where id > (select max_id from rain_newszl) 
	
	#将rain_newszl表中记录的值更改为最大的id
	sql_query_post	= update rain_newszl set max_id = (select id from rain_news order by id desc limit 1)
	
}
index news_zl
{
	source			=news_zl
	path			=D:\wamp\coreseek\var\data\newszl
	docinfo			=extern
	mlock			=0
	morphology		=none
	min_word_len	=1
	html_strip		=0
	charset_dictpath	=D:\wamp\coreseek\etc
	charset_type	=zh_cn.utf-8
}

在命令行执行下面两个命令:

D:\wamp\coreseek\bin\indexer.exe   -c    D:\wamp\coreseek\etc\sphinx.conf   news_zl --rotate //为增量记录建立索引

D:\wamp\coreseek\bin\indexer.exe   -c    D:\wamp\coreseek\etc\sphinx.conf  --merge  news  news_zl --rotate //将增量索引和原索引合并

增量索引通过上面三个步骤就可以完成。

修改记录

为修改的记录重新建立索引,同增加记录一样,需要新建一个表,存储修改记录的id,再为该表中所有记录重新建立索引,合并到原索引文件中。也分为三个步骤,这里在增加记录的基础上进行修改。

建表

//记录修改的id
create table rain_newsupdate
(
id  int unsigned
)engine=innodb charset=utf8;

修改配置文件

命令行执行跟增加记录中一样,没有修改

删除记录

对于删除记录,就要修改四处位置。

数据库表

在表中添加一列isdeleted,用于标识记录是否删除(其实在数据库中,该列没什么用处,主要是在sphinx索引文件中作为属性使用)
alter table rain_news add column isdeleted int default 0;

配置文件

在原配置文件和增量配置文件中都要添加这句话sql_attr_uint = isdeteled(在索引文件中声明isdeleted是一个属性,可以进行过滤),同时查询语句中也要添加该字段。

命令行执行语句也要修改

D:\wamp\coreseek\bin\indexer.exe   -c    D:\wamp\coreseek\etc\sphinx.conf   news_zl --rotate
D:\wamp\coreseek\bin\indexer.exe   -c    D:\wamp\coreseek\etc\sphinx.conf  --merge  news  news_zl  --merge-dst-range isdeleted 0 0 --rotate
//这里--merge-dst-range 前面有介绍

程序修改

在删除记录时,要更新索引文件中相应记录的isdeleted属性,将值修改为1;

从sphinx中查询带关键词记录id集合时,需要设置过滤,只匹配isdeleted为0的记录;
到此为止,增加、修改、删除记录的索引文件更新都已经完成,对于命令行的命令,可以新建一个批处理,定时执行即可。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36171次
    • 积分:1187
    • 等级:
    • 排名:千里之外
    • 原创:81篇
    • 转载:29篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论