当我们第一次使用indexer为表中内容建立索引后,当前表中内容都可以通过sphinxapi查询到。但是,当我们增加记录后,sphinx还未为增加的记录建立索引;修改记录后,应该为修改后记录重新建立索引;删除记录后,应该从索引文件中将该记录删除。以下,本文分别介绍这三种情况的处理方法。
增加记录
我们可以建立一张表,专门用于存放已经建立索引的最大主键id值;比如:第一次建立索引后,记录数据库表中最大id为max_id=100,当向数据库中添加10条新纪录后,数据库表中最大主键id变为了110。因此,我们只需要为大于max_id的这10条记录建立索引。
为此,我们可以再配置一个数据源和一个索引,定期执行,用于为新增记录建立索引。
新加一个表:
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
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的记录;
到此为止,增加、修改、删除记录的索引文件更新都已经完成,对于命令行的命令,可以新建一个批处理,定时执行即可。