zoukankan      html  css  js  c++  java
  • sphinx增量索引和主索引来实现索引的实时更新

    项目中文章的信息内容因为持续有新增,而文章总量的基数又比较大,所以做搜索的时候,用了主索引+增量索引这种方式来实现索引的实时更新。

    实现原理:

    1. 新建一张表,记录一下上一次已经创建好索引的最后一条记录的ID
     2. 当索引时,然后从数据库中取出所有ID大于上面那个sphinx中的那个ID的数据, 这些就是新的数据,然后创建一个小的索引文件
     3. 把上边我们创建的增量索引文件合并到主索引文件上去
     4. 把最后一条记录的ID更新到第一步创建的表中

    值得注意的两点:

    1)当合并索引的时候,只是把增量的索引合并进主索引中,增量索引本身并不会变化,也不会被删除;

    2)当重建主索引的时候,增量索引就会被删除;

    具体操作实现流程:

    1. 新建一张表,用于存储已经建过索引的最大的doc_id

    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. 配置索引文件

    复制代码
    #主索引数据源定义
    source article_main
    {
        type                    = mysql
        sql_host                =xxx.xxx.xxx.xx
        sql_user                = 
        sql_pass                =
        sql_db                  = 
    
        sql_port                = 3306
        sql_query_pre           = SET NAMES utf8
        sql_query_pre           = REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
    
      
       sql_query_range               = 
       sql_range_step                = 10000
       sql_query                               = 
                    SELECT *
                    FROM documents WHERE id>=$start AND id<=$end
    
        sql_attr_timestamp        = pubtime  #从SQL读取到的值必须为整数,作为时间属性
    
        sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
        sql_query_info            = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
    }
    复制代码
    复制代码
    # 增量索引数据源定义
    source article_delta : article_main
    {
        sql_query_pre = SET NAMES utf8
    
       sql_query_range               =
       sql_range_step                = 10000
       sql_query                               = 
                    SELECT *
                    FROM documents WHERE id>=$start AND id<=$end
    
        sql_attr_timestamp        = pubtime  #从SQL读取到的值必须为整数,作为时间属性
        # 增量索引创建完成之后,更新最大的doc_id
        sql_query_post  = UPDATE sph_counter  SET max_doc_id=(SELECT MAX(id) FROM documents) where counter_id=1
        #                      REPLACE INTO sph_counter SELECT 1, MAX(id) FROM documents
    
        sql_query_info_pre      = SET NAMES utf8                                        #命令行查询时,设置正确的字符集
        sql_query_info            = SELECT * FROM article_info WHERE id=$id #命令行查询时,从数据库读取原始数据信息
    
    }
    复制代码
    复制代码
    # 主索引index定义
    index article_main
    {
        source            = article_main             #对应的source名称
        path            = /data/... #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
        docinfo            = extern
        mlock            = 0
        morphology        = none
        min_word_len        = 1
        html_strip                = 0
    
        #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
        charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
        #charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
        charset_type        = zh_cn.utf-8
    }
    
    
    # 增量索引index定义
    index article_delta : article_main
    {
        source = article_delta
        path = /data/....
        docinfo            = extern
        mlock            = 0
        morphology        = none
        min_word_len        = 1
        html_strip                = 0
    
        #中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
        charset_dictpath = /usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
        #charset_dictpath = etc/                             #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
        charset_type        = zh_cn.utf-8
    }
    复制代码

    配置文件中修改好本部分之后,需要重新启动一下searchd进程,让其加载新的配置文件

    sudo /usr/local/coreseek4/bin/searchd -c /usr/local/coreseek4/etc/xxxx.conf  --stop

    sudo nohup /usr/local/coreseek4/bin/searchd -c /usr/local/coreseek4/etc/xxxx.conf &

    新建主索引 :

    sudo /usr/local/coreseek4/bin/indexer -c /usr/local/coreseek4/etc/xxxx.conf article_main --rotate

    过一段时间再新建增量索引(需要将此命令放到定时任务中,跑的频率按照实际需求来定)

    sudo /usr/local/coreseek4/bin/indexer -c /usr/local/coreseek4/etc/xxxx.conf article_delta --rotate

    下一步,自己可以用命令行的search来查询增量索引的内容

    /usr/local/coreseek4/bin/search -c /usr/local/coreseek4/etc/xxxx.conf  网络文章

  • 相关阅读:
    查准率(precision)和查全率(recall)
    数据集大全:25个深度学习的开放数据集
    利用贝叶斯算法实现手写体识别(Python)
    KNN算法识别手写数字
    判断点在直线的左右哪一侧
    多节点bigchaindb集群部署
    java 多线程 3 synchronized 同步
    java 多线程 1 “常用的实现多线程的2种方式”:Thread 和 Runnable
    java 字符串
    java 关键字static
  • 原文地址:https://www.cnblogs.com/cjymuyang/p/9582420.html
Copyright © 2011-2022 走看看