sphinx增量索引

原创 2015年11月20日 20:05:00

当我们第一次使用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的记录;
到此为止,增加、修改、删除记录的索引文件更新都已经完成,对于命令行的命令,可以新建一个批处理,定时执行即可。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Sphinx实时索引,用增量索引实现索引更新

我们前面知道,用./indexer --all 可以生成所有索引。当我们的数据很大,表的数据每天会逐渐添加,我们不可能再去重新生成下所有索引,这样性能方面会很差,那么,如何实现实时更新索引数据,又不影...

sphinx 增量索引 实现近实时更新

文章转载自 疯狂坦克 一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新...

sphinx 增量索引 实现近实时更新

一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。例如。原来的数据有几百...

Sphinx增量索引(转)

Sphinx增量索引(转) 在实际应用中往往有这么一种情况,数据库数据很大,比如我们的歌曲表,如果我们每次都去更新整个表的索引,对系统得开销将非常大,显然这是不合适,这时我们会发现,每天我们需要更新的...

sphinx增量索引和主索引来实现索引的实时更新

tips: Sphinx查询中Attribute(属性)的概念,而且Sphinx在启动Searchd的时候会将所有属性加载到内存中.所以如果数量巨大时可能会 FATAL: out of memory ...

sphinx 增量索引实现实例

注:sphinx的增量索引其实是通过两个索引来实现的,网上有说可以通过
  • clh604
  • clh604
  • 2014年07月18日 16:28
  • 1436

sphinx 增量索引更新

是基于PHP API调用,而不是基于sphinxSE。现在看来sphinxSE比API调用更简单的多,因为之前没有想过sphinxSE,现在先把API的弄明白。 涉及到的:sphinx 数据源的设...

sphinx 增量索引 实现近实时更新

一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。例如。原来的数据有几百...

sphinx 增量索引

Sphinx 实时索引数据库中的数据很大,然后我有些新的数据后来加入到数据库中,也希望能够检索到,全部重新建立索引很消耗资源,这样需要用到“主索引+增量索引”的思路来解决,这个模式实现的基本原理是设置...

sphinx 增量索引 实现定时更新

一.sphinx增量索引的设置    数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。例如。原来的数据有几百万...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sphinx增量索引
举报原因:
原因补充:

(最多只允许输入30个字)