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  網絡文章

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM