网上sphinx 主从索引增量配置都只能对新的记录ID进行增量?对旧的主索引里的数据进行更新改变后,如何更新索引?网上的流程是:
1) 建立一个增量索引计数表:sph_counter (counter_id ,max_doc_id)
2)配置一个主索引数据源: src1
     sql_query_pre       = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM products
    在生成主索引的时候把目标数据表products的最大主键id保存到计数表 sph_counter
    然后
     sql_query       = SELECT `id`, `title`, `desc` \
        FROM products WHERE `id` <= ( SELECT `max_doc_id` FROM sph_counter WHERE counter_id = 1 )
     这样会将max_doc_id之前的数据生成主索引src1_index
3)配置增量索引继承主索引的配置: src1_delta
    sql_query       = SELECT `id`, `title`,`desc` \
        FROM products WHERE `id` > ( SELECT `max_doc_id` FROM sph_counter WHERE counter_id = 1 )
   也就是说增量索引文件的信息只包括了max_doc_id之后的记录。
4)写shell脚本把生成索引命令行加入crontab定时任务
    比如每3分钟生成一次增量索引,每天晚上2点合并一次主从索引。细心的你就会发现,按照这种配置,每次3分钟生成的索引都是这3分钟内新插入的记录信息,至于3分钟内由于更新旧记录而产生的信息变更是不会生成到增量索引中的,那么每天晚上合并主从索引也会遗漏更新的记录变更,对吗?由此我感觉只有每天晚上重新对所有数据重新生成索引而不是合并索引才是正确的,但这样的话就没有必要用到表sph_counter了吧,直接查询的时候从增量索引和主索引里搜索结果就行了。请用过的帮忙解释下,指出我的理解是不是有误,谢谢!难道这是一个重要的,但很久不为人知的发现吗??

解决方案 »

  1.   

    目前找到个办法,就是在数据表中添加update_time字段,每次更新数据都修改此字段值,然后在sphinx获取增量数据时将max(update_time)值保存到sph_counter.last_time中,下次获取增量数据时使用条件update_time> sph_counter.last_time来筛选而不用max(id)来筛选。
      

  2.   

    如果只更新文档属性的话(不更新索引内容),增量索引的方式保持不变,可以通过客户端Api更新(UpdateAttribute)对应的索引,同时更新数据库。