这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主索引,而对新增文档建立增量索引。在上述例子中,那1000000个已经归档的帖子放在主索引中,而每天新增的1000个帖子则放在增量索引中。增量索引更新的频率可以非常快,而文档可以在出现几分种内就可以被检索到。
确定具体某一文档的分属那个索引的分类工作可以自动完成。一个可选的方案是,建立一个计数表,记录将文档集分成两部分的那个文档ID,而每次重新构建主索引时,这个表都会被更新。
这里再用我的理解跟大家陈述一遍(如果大家有看我的前面两篇博客,这里会看的非常明白):
在前面我有一张documents表,现在我要往里面添加一篇文章,我想使这篇文章被检索到,就要执行 /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/csft.conf --all --rotate,要想减少能够检索的时间,我们可以使用crontab实现每分钟执行一次该命令。
然而这条命令是把整张表重新建立主数据索引,假如该表现在已经有好几千万条数据了,如果把整张表的数据重新建立索引,就会大量的消耗服务器CPU和内存。
上面说的解决方案就是,我能不能仅仅对今天新增的数据建立索引,主数据索引保持不变?毕竟一天内新增的数据不会太多。
这里实现的办法就是“主索引+增量索引”,原来的数据保存在主索引里面,而新增的数据就保存在增量索引里面,在服务器空闲的时候(一般在凌晨),在将增量索引并到主索引中去,这样就不会影响到第二天的建立增量索引。
2、建立计数表该表的作用是记录将文档集分成两部分的那个文档ID(一部分保存在主数据索引,一部分保存在增量索引),其实就是昨晚将增量索引并入主数据索引时 documents 数据表的 id 的最大值,而每次重新构建主索引时,这个表都会被更新。
创建计数表:
mysql -uroot -pzhongjin test; CREATE TABLE sph_counter( counter_id INT PRIMARY KEY NOT NULL, max_doc_id INT NOT NULL ); 3、修改配置文件csft.conf在修改配置文件之前,给大家说一下 mysql 中的 REPLACE INTO 的用法:
使用 REPLACE INTO 的时候会带上一个主键,假如目标数据表中对应的该主键没有数据,那么 REPLACE INTO 就会往里面插数据(相当于 INSERT INTO)。假如该主键已经有数据了,REPLACE INTO就会更新该条数据。
修改配置文件 csft.conf:
#1、在主数据源中(source main{})修改: #新增一行,作用是更新sph_counter表 sql_query_pre = REPLACE INTO sph_counter SELECT 1,MAX(id) FROM documents; #2、将增量数据源(source src1throttled : src1{})的注释打开 #修改增量数据源名字并添加如下内容: source delta : main{ sql_ranged_throttle = 100 sql_query_pre = SET NAMES UTF8 sql_query = \ SELECT id,group_id,UNIX_TIMESTAMP(date_added) AS date_added,title,content FROM \ documents WHERE id > (SELECT max_doc_id FROM sph_counter WHERE counter_id = 1) } 3、将增量数据索引(index test1stemmed : test1){})的注释打开 #修改增量数据索引名字并添加如下内容: index delta : main { source = delta path = /usr/local/coreseek/var/data/delta morphology = stem_en }注意:增量数据源的sql语句搜索出来的结果字段一定要与主数据源的对称,因为他俩是继承关系,如果不对称,就会报错:字段不统一