使用sphinx作为全文搜索,在进行同步MySQL记录到Sphinx时需要执行 `indexer --rotate --all` 否则无法更新到全部新增数据。但如果数据量过大,将执行时间过长。数据更新频繁,则需要一直执行这个命令。
网上的方案,通过记录增量ID,再生成增量索引数据,再合并增量索引数据到全量索引中。
但存在问题:1)如果数据源MySQL记录中有被删除,如何做到同步实时同步到这个查询索引,因为plain类索引是不能做删除。
2)这样的方案并未用到RT实时索引。如何使用到RT索引,什么情况下使用。SphinxQL 可否同时在 RT索引 和 plain 索引中查询?

解决方案 »

  1.   

    感谢邀请,win和linux上的sphinx我都简单使用过,你说的问题确实需要考虑。
    对你的提问,我也不是很清楚,也没实践过,有几点想法仅供参考如果全部更新索引,那么就算N分钟更新一次,也会有数据的不准确的情况,也就是说这种情况无法实时准确,除非每更新数据就执行一下更新索引。
    其二数据量如果庞大的话,对系统也是一种开销。我觉的可以在系统运行时,实行增量索引,每天访问低峰期全部更新一次索引。
    sphinx可以只返回Id,那么可以对返回的结果进行二次过滤,筛选掉实际数据不符合的记录,小批量验证应该影响不大。另外一个想法是每更新记录就更新索引,定义多个源,比如id平均2W左右定义一个源,更新的记录在哪个id区间,则更新哪个源。这样不用对结果二次筛选。如果数据量并不大,可以全部更新。
      

  2.   

    现在使用Sphinx2完成了,不过移植到Sphinx3上面出现问题。提示`--merge-klists`未知参数。
    [code]ERROR: malformed or unknown option near '--merge-klists'.[/code]
      

  3.   

    打算放弃使用Sphinx 3x版本了,感觉这东西很多严重问题!!kbatch指令刚开始会运行删除main索引,多执行几次就出问题了,不生效了,重新启动重建全部又可以了。
    --merge 也是,一开始merge delta到main 正常OK,多执行几次,就完全不对头了,提示执行成功但数据完全没merge过去。SphinxSearch 官方都一种不更新不维护的状态了。
      

  4.   

    不要物理删除 源那加上or update_time