sphinx 实时索引更新

来源:互联网 发布:php用来做什么的 编辑:程序博客网 时间:2024/05/29 17:48
原文地址:实时索引更新">sphinx 实时索引更新作者:php_sir

1 实时索引更新
有这么一种常见的情况:整个数据集非常大,以至于难于经常性的重建索引,但是每次新增
的记录却相当地少。一个典型的例子是:一个论坛有1000000个已经归档的帖子,但每天只
有1000个新帖子。
在这种情况下可以用所谓的“主索引+增量索引”(main+delta)模式来实现“近实时”的
索引更新。
这种方法的基本思路是设置两个数据源和两个索引,对很少更新或根本不更新的数据建立主
索引,而对新增文档建立增量索引。在上述例子中,那1000000个已经归档的帖子放在主索
引中,而每天新增的1000个帖子则放在增量索引中。增量索引更新的频率可以非常快,而
文档可以在出现几分种内就可以被检索到。
确定具体某一文档的分属那个索引的分类工作可以自动完成。一个可选的方案是,建立一个
计数表,记录将文档集分成两部分的那个文档ID,而每次重新构建主索引时,这个表都会被更新。
示例 全自动的即时更新
# in MySQL
CREATE TABLE sph_counter
(
counter_id INTEGER PRIMARY KEY NOT NULL,
max_doc_id INTEGER NOT NULL
);
# in sphinx.conf
source main
{
# ...
sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROMdocuments
sql_query = SELECT id, title, body FROM documents
WHERE id<=( SELECT max_doc_id FROM sph_counter WHEREcounter_id=1 )
}
source delta : main
{
sql_query_pre =
sql_query = SELECT id, title, body FROM documents
WHERE id>( SELECT max_doc_id FROM sph_counter WHEREcounter_id=1 )
}
index main
{
source = main
path = /path/to/main
# ... all the other settings
}
# note how all other settings are copied from main,
# but source and path are overridden (they MUST be)
index delta : main
{
source = delta
path = /path/to/delta
}

 

2 索引合并
合并两个已有的索引比重新对所有数据做索引更有效率,而且有时候必须这样做(例如在“
主索引+增量索引”分区模式中应合并主索引和增量索引,而不是简单地重新索引“主索引
对应的数据)。因此indexer有这个选项。合并索引一般比重新索引快,但在大型索引上仍
然不是一蹴而就。基本上,待合并的两个索引都会被读入内存一次,而合并后的内容需要写
入磁盘一次。例如,合并100GB和1GB的两个索引将导致202GB的IO操作(但很可能还
是比重新索引少)
基本的命令语法如下:
indexer --merge DSTINDEX SRCINDEX[--rotate]

 

SRCINDEX的内容被合并到DSTINDEX中,因此只有DSTINDEX索引会被改变。若
DSTINDEX已经被searchd用于提供服务,则--rotate参数是必须的。最初设计的使用模式是,
将小量的更新从SRCINDEX合并到DSTINDEX中。因此,当属性被合并时,一旦出现了重
复的文档ID,SRCINDEX中的属性值更优先(会覆盖DSTINDEX中的值)。不过要注意,
“旧的”关键字并不会被自动删除。例如,在DSTINDEX中有一个叫做“old”的关键字与文
档123相关联,而在SRCINDEX中则有关键字“new”与同一个文档相关,那么在合并后用
这两个关键字都能找到文档123。您可以给出一个显式条件来将文档从DSTINDEX中移除,
以便应对这种情况,相关的开关是--merge-dst-range:
indexer --merge main delta --merge-dst-rangedeleted 0 0


这个开关允许您在合并过程中对目标索引实施过滤。过滤器可以有多个,只有满足全部过滤
条件的文档才会在最终合并后的索引中出现。在上述例子中,过滤器只允许“deleted”为0
的那些条件通过,而去除所有标记为已删除(“deleted”)的记录(可以通过调用
UpdateAttributes() 设置文档的属性)。

0 0
原创粉丝点击