Sphinx增量索引

来源:互联网 发布:淘宝访问深度怎么算 编辑:程序博客网 时间:2024/05/16 13:05

sphinx创建索引之后,如果我们的数据库又增加了一条数据,需要重新创建索引。但是如果数据量十分庞大时,每次都重新创建索引显然是不合适的。

我们希望实现的效果是,每次都只创建新增的数据的索引。

增量索引实现原理

假设现在数据库中有三条数据,id分别为1,2,3。

使用indexer命令为这三条数据创建索引,并把max_doc_id=3记录到一张表(sphinx_counter)中,表示当前主索引已经创建了id<=3的所有数据的索引

假设此时有新的数据插入,id为4,5。然后为这两条新数据创建索引,称之为增量索引,同时更新sphinx_counter表,max_doc_id=5

最后使用indexer --merge将增量索引合并到主索引中

sphinx_counter表结构如下:

DROP TABLE IF EXISTS `sphinx_counter`;CREATE TABLE `sphinx_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;

增量索引配置

#===================数据源配置=================#主索引数据源source article_src {    type            = mysql    sql_host        = localhost    sql_user        = root     sql_pass        = root      sql_db          = sphinx     sql_port        = 3306  # optional, default is 3306    sql_query   = SELECT id, content,createtime FROM article WHERE id<=( SELECT max_doc_id FROM sphinx_counter WHERE counter_id=1 )      sql_query_pre      = SET NAMES utf8     sql_query_pre      = SET SESSION query_cache_type=OFF     #创建主索引时,将最大文档id插入到sphinx_counter表中  sql_query_pre = REPLACE INTO sphinx_counter SELECT 1, MAX(id) FROM article }#增量索引数据源source article_delta_src: article_src{    sql_query_pre = SET NAMES utf8   sql_query_range               =   sql_range_step                = 10000     #增量索引只查询新增的数据   sql_query   = SELECT * FROM article where  id>( SELECT max_doc_id FROM sphinx_counter WHERE counter_id=1 )     # 增量索引创建完成之后,更新最大的doc_id         sql_query_post  = UPDATE sphinx_counter  SET max_doc_id=(SELECT MAX(id) FROM article) where counter_id=1 } #===================索引配置=================#主索引index article_index {    source          = article_src     path            = /usr/local/sphinx/var/data/article}#增量索引index article_delta_index : article_index{    source   = article_delta_src    path     = /usr/local/sphinx/var/data/article_delta}indexer{    mem_limit       = 128M}searchd{    listen          = 9312    listen          = 9306:mysql41    log         = /usr/local/sphinx/var/log/searchd.log    query_log       = /usr/local/sphinx/var/log/query.log    read_timeout        = 5    max_children        = 30    pid_file        = /usr/local/sphinx/var/log/searchd.pid    seamless_rotate     = 1    preopen_indexes     = 1    unlink_old      = 1    workers         = threads # for RT to work    binlog_path     = /usr/local/sphinx/var/data}

定时索引任务

我们要写一个增量索引的脚本,定时去执行这个脚本

#!/bin/bash#创建增量索引/usr/local/sphinx/bin/indexer article_delta_index --rotate#合并增量索引和主索引/usr/local/sphinx/bin/indexer --merge article_index article_delta_index --rotate

--rotate表示通知searchd进程有索引更新了,如果没有这个参数,必须停止searchd进程才能创建索引

一般情况我们也会创建一个主索引脚本,每天半夜无人时去执行一次,来全部重新创建索引

#!/bin/bash/usr/local/sphinx/bin/indexer article_index --rotate

注意

  1. 如果不合并增量索引和主索引,每次创建增量索引都会覆盖之前创建的增量索引,导致索引丢失
  2. 合并索引时的IO消耗是索引文件大小的两倍,假设主索引文件大小是100G,增量索引大小是2G,那么IO消耗是(100+2)*2 = 204G,虽然IO消耗大,但相比全部重新创建索引来说,还是小得多。
0 0
原创粉丝点击