Sphinx高性能实时索引的解决方案

常用Sphinx实时索引的方法及其弊端:

1)定时(短间隔时间)重建全量索引。当数据量大时重建全量索引需要较长的时间及服务器资源。

2)定时(较长间隔时间)重建全量索引并记录最大ID(maxid),配合定时(短间隔时间)重建ID大于maxid的文档增量索引。如果对ID小于或等于maxid的文档数据进行修改或删除,则会产生“幽灵结果”。虽然Sphinx提供了updateAttributes,但只能更新属性,对于全文检索的字段无能为力。

3)直接操作实时索引表。在数据量大时,性能不佳。


解决方案:全量索引+增量索引+实时索引

1)定时(较长间隔时间)重建全量索引,并记录最大ID(maxid)及重建时间(indextime),同时重新增量索引(清空)及清空实时索引

2)定时(短间隔时间)进行一次增量索引重建及实时索引更新。重建ID大于maxid的文档增量索引,需要设置“sql_query_killlist”为ID小于或等于maxid,并且已删除或修改时间大于indextime;将修改的文档数据更新到实时索引表。


配置示例:

....

source main{

....

sql_query  = SELECT id, group_id,  UNIX_TIMESTAMP(date_added) AS date_added, title, content  FROM documents  WHERE isdel=0

sql_query_post = UPDATE counters SET temp_indextime = UNIX_TIMESTAMP(NOW()) WHERE id = 1

sql_query_post_index    = UPDATE counters SET maxid=$maxid,indextime=temp_indextime WHERE id = 1

#sql_query_post与sql_query_post_index的区别在于:当Sphinx获取到全部文档数据后,立即执行sql_query_post,但是构建索引的过程可能因为某种原因失败。当sql_query_post_index被执行时,可以理所当然的认为索引已经成功构造完了。

....

}

source increment: main

{
....

sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content  FROM documents WHERE id>(select maxid from counters where id=1) and isdel=0

sql_query_post =

sql_query_post_index =

sql_query_killlist    = SELECT id FROM documents WHERE utime>=(select indextime from counters where id=1) or isdel=1

....
}

....


其它:

建立索引的执行过程如下:
连接到数据库;
执行预查询 (sql_query_pre) ,以便完成所有必须的初始设置,比如为MySQL连接设置编码;
执行主查询 (sql_query) ,其返回的的数据将被索引;
执行后查询 (sql_query_post) ,以便完成所有必须的清理工作;
关闭到数据库的连接;
对短语进行排序 (或者学究一点, 索引类型相关的后处理);
再次建立到数据库的连接;
执行后索引查询 (sql_query_post_index) ,以便完成所有最终的清理善后工作;
再次关闭到数据库的连接


sql_joined_field 关联的表必须包含文档ID,即sql_query里的第一列,关联获取的关键字是用于全文检索。可用于垂直分表,如新闻标题与内容在不同的表,而全文检索的范围又包括了标题和内容。
sql_query里的列如果设置为sql_attr_*的则为属性字段(可作为过滤或排序字段),不作为全文检索字段
sql_field_string的字段既作为全文检索字段,也作为属性字段
sql_query_post(后查询)与sql_query_post_index(索引后查询)的区别在于:当Sphinx获取到全部文档数据后,立即执行后查询,但是构建索引的过程可能因为某种原因失败。在另一方面,当索引后查询被执行时,可以理所当然的认为索引已经成功构造完了。因为构造索引可能是个漫长的过程,因此对与数据库的连接在执行后索引操作后被关闭,在执行索引后操作前被再次打开。


当如下条件满足时,SPH_MATCH_FULLSCAN模式自动代替其他指定的模式被激活:
1. 查询串是空的(即长度字符串为零)
2. docinfo 存储方式为 extern.
注意,在SPH_MATCH_FULLSCAN模式中,文档必须有至少一个属性。否则,即便设置docinfo的存储方式为extern,也无法启用完整扫描模式。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值