见世界

delta index of reference

没看到什么“sphinx最佳实践”,我这种懒人往往是读读文档,实现功能后就不再深究。
最近改了个增量索引引起的bug,借机思考总结出一些问题。写在这里。

现有tag, skill, skill_tag表,一个skill可以对应多个tag。
以id, tag_id, skill_id … …的形式导入sphinx。
通过php sphinxapi:setGroupBy的同时setSelect以此赋予tag_id不同的权重。
结果发现得到的权重与预期不同。
进过排查调试发现原因:从主索引、增量索引中检索数据,出现重复的skill_id。

这里涉及我们实现增量索引的方式。
我们不做合并,每天更新一次主索引,据skill_tag表最后更新时间设定界限,根据界限值每三分钟做一次增量索引。
问题就在于,这个限定条件,并不能限定skill_id在主、增索引中不存在交集。

解决思路只用一个索引,方案有两个:
1. 只做主索引,每三分钟更新一次,数据量不大时可以接受
2. 每三分钟做增量索引,合并进主索引。通用性比较好

===================== 主观的分割线 ===========================
解决这个问题的过程中我犯了几个错误,我惊恐的发现有些错误以前也犯过。

=============我的第一个问题=================
思路:

新入职公司,问题放在眼前。我看到
1) 项目的sphinx取数据时做了大量联表操作,冗余了大量信息。查询语句也是把全文索引当做关系型数据库在用。
2) 技术总监亲自调试了很长时间,没有结论。
我一贯的观点是专用:索引的归索引,DB的归DB。我倾向于只使用sphinx加速文本检索,因为mysql作为关系型数据库,处理各个数量级的数据有一整套成熟方案。sphinx在关系型数据库方面的表现还是未知。
强力同事调试没有头绪,我判断是设计问题,猜测问题出在sphinx遍历数据时忽略了最大值之后的数据。请示后改用我的思路:小而专用的sphinx索引,id运算交给mysql。
方案的问题:
一元分词查询的准确度,显然不如id的关系运算。
换用coreseek进行分词,没有db配合,也不能完美重现程序功能。
上头又不许用“sql+缓存”的策略,因为推倒重来毕竟不现实。
总结:
做事风风火火,缺少深思熟虑和严谨验证。
具体到这个问题,本来很多细节都能够再敲定一下。我也有意识的去克制大动干戈的操作,却仍不足以驾驭犯二的热情。“技术狂热”的状态下,对判断依据的理解有太强的选择性。

我不是所谓的完美主义者,但一直觉得如果同样的错误只犯一次,那今天永远比昨天强。代码写下去,是在向前走。这是我学习方法的基础之一,这点必须保证。所以像这种意识到了却不能阻止其发生的错误,我认为需要写篇文章记录一下。理科生讨厌这种无力感。

=============之后的问题=================
定位是索引的问题,纠正的过程中险些又犯了错。
既然错误的症状是skill_id在主索引和增量索引上有重复,那么重写增量索引的建立逻辑,保证skill_id的严格分界是不是就解决了问题?于是着手改配置文件。
可是一旦限定了skill_id唯一,sphinx就不能及时更新skill_tag的关系变化情况,以tag为主题进行的搜索功能就缺失了。不能这么改。
是不是多建一个索引呢?或者变更业务逻辑使用另外的索引实现?隐约觉得这并不是好的解决方案。
我开始思考,能不能两全?进而思考,这种关系型的数据能否建增量索引?
关系的更新,不外乎add, delele和update,update可由add+delete实现,只有两种操作。
add操作,增量可以实现。delete呢?我们建增量的方式不能改动主索引,必须换方法。这个才是问题的根源。
思路走到这里,问题已经明朗,不由得为自己浅尝辄止的思维习惯感到后怕。
但是还没完。
我在crontab里看到这样一句被注释掉的命令:

#/root/ss/bin/indexer -c /root/ss/conf/xxxxx.conf –merge skill_tag_index skill_tag_delta_index –merge-dst-range deleted 0 0 –rotate
不知道谁因为什么加了注释,它为主索引同步了delete操作,亦即我们方法的缺陷。
这条命令是增量索引的常规做法必备的命令。

因为缺乏这个经验,因为没有切实的去部署那么一次,付出了很大的调试代价。
我从之前磕磕绊绊形而上思索带来的满足感中,一下子落回地面,觉得很空虚。
“十分力做八分事,掌握成熟的解决方案,以期完美的解决问题”,坚持这么做的自己反而尝到了苦果。这一点和上面的问题何其相似啊!

ps:
始终觉得,自高中懒做习题以来,对数学的远离影响了逻辑思维的严谨性。
想不到现在甚至远离了逻辑思维本身。
上面的推理进行的很艰苦,感到变化太多,无法控制。用笔在纸上画图的时候,居然觉得这一切十分陌生。有很久不打球咋上场肌肉颤抖的感觉。
用进废退,上一次深入思考什么东西是在啥时候?