zoukankan      html  css  js  c++  java
  • sphinx 增量索引 实现近实时更新

        由于sphinx主索引建立后,如果数据库有新的数据添加的话,需要重新生成主索引,如果数据量大就耗费资源,不如添加哪些数据就生成这些数据的索引,称为‘增量索引’。

    实现思路:

    需要准备:1》建立一张表,记录数据最大id值。2》两个索引

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

    CREATE TABLE sph_counter(    counter_id INTEGER PRIMARY KEY NOT NULL,    max_doc_id INTEGER NOT NULL);

    2.修改sphinx.conf

    source main_src{

           type                = mysql

           sql_host            = localhost

           sql_user            = yourusername

           sql_pass            = yourpassword

           sql_db              = test   //你所用的数据库

           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             = /path/to/main

           # example:   /usr/local/sphinx/var/data/main      .............

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

           chinese_dictionary =/usr/local/mmseg3/etc/       #中文检索路径

    }

    #delta可全部复制主索引,然后更改source 和path如下
      #增量索引

    index delta: main {

             source = delta_src

             path     = /path/to/delta

             # example:  /usr/local/sphinx/var/data/delta…    

       chinese_dictionary =/usr/local/mmseg3/etc/       #中文检索路径

    }

    其它的配置可都用默认的,如果你设置了分布式检索的索引,那么更改下对应的索引名称即可。

    3.重新建立索引:

     /usr/local/coreseek/bin/indexer -c /usr/local/coreseek/etc/sphinx.conf --all --rotate
    接下来的问题是如何让增量索引与主索引合并

    4.索引合并
    合并两个已有索引 有时比 重新索引所有数据有效,虽然,索引合并时,待合并的两个索引都会被读入内存一次,合并后的内容需写入磁盘一次,即,合并100GB和1GB的两个所以,将导致202GB的IO操作
    命令原型:  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 filename 这样才能运行。即
    chmod +x build_main_index.sh
    chmod +x build_delta_index.sh

    最后,我们需要脚本能够自动运行,以实现,delta索引每5分钟重新建立,和main索引只在午夜2:30时重新建立。

    使用crontab 命令 这有俩个地方可作参考 crontab  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 脚本,输出重定向。
    关于前面的 5个值的设置,在上面的crontab文件中有详细的描述。关于重定向的解释,请看最上面的Crontab笔记 ,也有crontab的介绍。

    保存好后:重新启动服务
      [root@test1 init.d]# service crond stop
    [root@test1 init.d]# service crond start
    或者
    /etc/init.d/crontab   start

    执行计划任务就可以了,合并索引适合修改数据库少的情况,如果修改数据库数据,则需要再次读取数据库生成主索引,具体根据业务需求制定计划。

  • 相关阅读:
    [CentOS7] 常用工具 之 差异备份工具 rdiff-backup
    [CentOS7] 常用工具 之 防暴力破解工具 Fail2ban
    [CentOS7] 增加yum源
    [CentOS7] firewalld重启失败 Failed to start firewalld
    常见性能优化
    Acunetix 11 配置详解
    linux 环境安装及学习
    linux 个人配置记录
    linux 配置阿里云yum库
    阿里云 oss实时日志查询
  • 原文地址:https://www.cnblogs.com/wangzhilei/p/6714136.html
Copyright © 2011-2022 走看看