索引文件的更新
思路:如果一条记录修改了,那么就为这条记录重新生成索引。新的记录的索引会覆盖原来旧的的记录的索引
1.创建一张表:记录所有被修改过的记录的ID
create table uprecord(
id int unsigned not null comment '修改过的记录的ID'
)
2.通过PHP程序记录下用户修改一条记录之后,把这条记录的ID插入到uprecord表中
3.修改sphinx的配置文件(修改增量索引的SQL语句)把修改过的记录也取出来,取出来之后就会把以前的索引给覆盖掉
4 清空uprecord表
sql_query_post =UPDATE a SET max_id=(SELECT max(id) FROM dede_archives);DELETE FROM uprecord;
索引文件的删除:
1 修改电影表添加一个字段用来标记是否删除:
alter table dede_archives add is_deleted unsigned not null default '0';
2 修改sphinx的配置文件,在电影的数据源上添加一个属性(必须)
#源定义
source mymovie
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = 123456
sql_db = dedecms831
sql_port = 3306
#命令行查询时,设置正确的字符集
sql_query_pre = SET NAMES utf8
sql_query = SELECT a.id,a.title,b.juqing FROM dede_archives a LEFT JOIN dede_addon7 b ON a.id=b.aid
#在索引创建好之后把最后一条记录的ID存放到A表中
sql_query_post =UPDATE a SET max_id=(SELECT max(id) FROM dede_archives)
sql_attr_bool =is_deleted //增加一个属性is_deleted
}
3 修改PHP的程序在查询SPHINX时只取出is_deleted属性为0的
$sp ->SetFilter("is_deleted", array(0)) //查询时,只查询出is_deleted等于0的记录
4 修改PHP的程序,当删除一条记录时
a.从数据库更新这条记录的is_deleted=1
b.更新SPHINX的删除属性为1:需要调用一个方法UpdateAttributes('is_deleted',array(5=>1)) 意思是设置id等于5的这条记录 将其is_deleted字段值设置为1,array()可以有多个
UpdateAttributes('is_deleted',array(5=>1,6=>1,8=>1))数组的键值代表记录的ID
5 在生成增量索引之后
a.可以删除is_deleted=1的从数据库中删除
sql_query_post = UPDATE a SET max_id=(SELECT max(id) FROM dede_archives);DELETE FROM uprecord;DELETE FROM dede_archives WHERE is_deleted='1';
b.修改合并的命令在合并时,添加一个参数is_deleted 只取is_deleted为0的记录.
C:\myenv\coreseek-3.2.14-win32\bin>indexer.exe -c C:\myenv\coreseek-3.2.14-win32\sphinx.conf
--merge mymovie mymovie_zl --merge-dst-range is_deleted 0 0 --roate