sphinx 增量索引

sphinx增量索引的设置

数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到。全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少。例如,原来的数据有几百万条,而新增的只是几千条。这样就可以使用“主索引+增量索引”的模式来实现近乎实时更新的功能。

这个模式实现的基本原理是设置两个数据源和两个索引,为那些基本不更新的数据建立主索引,而对于那些新增的数据建立增量索引。主索引的更新频率可以设置的长一些(例如设置在每天的午夜进行),而增量索引的更新频率,我们可以将时间设置的很短(几分钟左右),这样在用户搜索的时候,我们可以同时查询这两个索引的数据。

使用“主索引+增量索引”方法有个简单的实现,在数据库中增加一个计数表,记录每次重新构建主索引时,被索引表的最后一个数据id,这样在增量索引时只需要索引这个id以后的数据即可,每次重新构建主索引时都更新这个表。

1.先在mysql中插入一个计数表和两个索引

CREATE TABLE `sph_counter` (

  `counter_id` int(11) NOT NULL COMMENT '标识不同的数据表',

  `max_doc_id` int(11) NOT NULL COMMENT '每个索引表的最大ID,会实时更新',

  PRIMARY KEY (`counter_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

2.修改sphinx.conf

source main_src {

    type                = mysql

    sql_host            = localhost

    sql_user            = root

    sql_pass            = root

    sql_db              = task   //所用的数据库

    sql_port            = 3306 //所用端口,默认是3306

    sql_query_pre       = SET NAMES utf8

    sql_query_pre       = SET SESSION query_cache_type=OFF       

    #下面的语句是更新sph_counter表中的 max_doc_id。       

    sql_query_pre = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents

    sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, \

            content FROM documents \

            WHERE id<=( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 ) 

}

//注意:delta_src 中的sql_query_pre的个数需和 main_src 对应

source delta_src: main_src {

         sql_ranged_throttle = 100

         sql_query_pre       = SET NAMES utf8

         sql_query_pre       = SET SESSION query_cache_type=OFF

         sql_query      = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, \

            content FROM documents \

            WHERE id>( SELECT max_doc_id FROM sph_counter WHERE counter_id=1 )

}

//主索引

index main {

       source           = main_src

       path             = /usr/local/sphinx/var/data/main

       charset_type     = utf-8    #这个是支持中文必须要设置的

       chinese_dictionary = /usr/local/sphinx/etc/xdict

}

 //增量索引

index delta: main {

         source = delta_src

         path     = /usr/local/sphinx/var/data/delta   

}

其它的使用默认配置

3.重新建立索引

$ /usr/local/sphinx/bin/searchd --stop

$ /usr/local/sphinx/bin/indexer -c  /usr/local/sphinx/etc/sphinx.conf --all

$ /usr/local/sphinx/bin/searchd -c  /usr/local/sphinx/etc/sphinx.conf

$ /usr/local/sphinx/bin/indexer -c  /usr/local/sphinx/etc/sphinx.conf --all --rotate (不需要停止searchd,索引后也不再需要重启searchd)

如果想测试增量索引是否成功,往数据库表中插入数据,查找是否能够检索到,这个时候检索应该为空,然后,单独重建 delta 索引

$ /usr/local/sphinx/bin/indexer -c /usr/lcoal/sphinx/etc/sphinx.conf delta

4.索引合并

命令原型:  indexer --merge DSTINDEX  SRCINDEX [--rotate]   

将SRCINDEX合并到 DSTINDEX, 所以只有DSTINDEX会改变,如果两个索引都正在提供服务,那么 --rotate 参数是必须的。

例如:将delta合并到main中

indexer --merge main delta

5.索引自动更新

建立两个脚本:build_main_index.sh 和 build_delta_index.sh

build_main_index.sh:

#!/bin/sh

#停止正在运行的searchd

/usr/local/sphinx/bin/searchd -c /usr/local/sphinx/etc/mersphinx.conf  --stop >> /usr/local/sphinx/var/log/sphinx/searchd.log

#建立主索引

/usr/local/sphinx/bin/indexer -c /usr/local/sphinx/etc/mersphinx.conf main >> /usr/local/sphinx/var/log/sphinx/mainindex.log

#启动searchd守护程序

/usr/local/sphinx/bin/searchd >> /usr/local/sphinx/var/log/sphinx/searchd.log

build_delta_index.sh

#!/bin/sh

#停止sphinx服务,将输出重定向

/usr/local/sphinx/bin/searchd –stop >> /usr/local/sphinx/var/log/sphinx/searchd.log

#重新建立索引delta ,将输出重定向

/usr/local/sphinx/bin/indexer delta –c /usr/local/sphinx/etc/sphinx.conf>>/usr/lcoal/sphinx/var/log/sphinx/deltaindex.log

#将delta合并到main中

/usr/local/sphinx/bin/indexer –merge main delta –c /usr/local/sphinx/etc/sphinx.conf >> /usr/lcoal/sphinx/var/log/sphinx/deltaindex.log

#启动服务

/usr/local/sphinx/bin/searchd >> /usr/local/sphinx/var/log/sphinx/searchd.log

设置可执行

chmod +x build_main_index.sh

chmod +x build_delta_index.sh

使用crontab 命令设置定时执行

crontab -e 来编辑 crontab 文件

*/30 * * * *  /bin/sh /usr/local/sphinx/etc/build_delta_index.sh > /dev/null 2>&1

30 2 * * * /bin/sh /usr/local/sphinx/etc/build_main_index.sh > /dev/null 2>&1

第一条是表示每30分钟运行 /usr/local/sphinx/etc/下的build_delta_index.sh 脚本,输出重定向。

第二条是表示 每天的 凌晨2:30分运行 /usr/local/sphinx/etc下的build_main_inde.sh 脚本,输出重定向。

相关推荐