sphinx 增量索引實現實例
注:sphinx的增量索引其實是通過兩個索引來實現的(主索引每天凌晨更新,增量索引每5分鐘生成一次),網上有說可以通過索引merge合并成一個索引,但我試了試沒有真的合并進去
sphinx 增量索引的設置 數據庫中的已有數據很大,又不斷有新數據加入到數據庫中,也希望能夠檢索到。全部重新建立索引很消耗資源,因為我們需要更新的數據相比較而言很少。 例如。原來的數據有幾百萬條,而新增的只是幾千條。這樣就可以使用“主索引+增量索引”的模式來實現近乎實時更新的功能。
這 個模式實現的基本原理是設置兩個數據源和兩個索引,為那些基本不更新的數據建立主索引,而對于那些新 增的數據建立增量索引。主索引的更新頻率可以設置的長一些(例如設置在每天的午夜進行),而增量索引的更新頻率,我們可以將時間設置的很短(幾分鐘左 右),這樣在用戶搜索的時候,我們可以同時查詢這兩個索引的數據。
使用“主索引+增量索引”方法有個簡單的實現,在數據庫中增加一個計數表,記錄每次重新構建主索引時,被索引表的最后一個數據id,這樣在增量索引時只需要索引這個id以后的數據即可,每次重新構建主索引時都更新這個表。
測試條件:以默認的sphinx.conf配置為例,數據庫表的數據也以 example.sql為例。
1、創建相關表
創建主索引表 CREATE TABLE `sph_test1` ( `id` int(10) unsigned NOT NULL, `weight` int(11) NOT NULL, `query` varchar(3072) CHARACTER SET latin1 NOT NULL, `group_id` int(11) DEFAULT NULL, KEY `query` (`query`) ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/test1' 創建索引計數表 CREATE TABLE `sph_counter` ( `id` int(11) NOT NULL, `max_doc_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) 創建增量索引表 CREATE TABLE `sph_delta_test1` ( `id` int(10) unsigned NOT NULL, `weight` int(11) NOT NULL, `query` varchar(3072) NOT NULL, `group_id` int(11) DEFAULT NULL, KEY `query` (`query`(1024)) ) ENGINE=SPHINX DEFAULT CHARSET=utf8 CONNECTION='sphinx://127.0.0.1:9312/delta_test1'
2、修改sphinx.conf
source src1{ 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 = 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_src1: src1{ 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 test1 //主索引{ source = src1 path = /usr/local/sphinx/var/data/test1 charset_type = utf-8 #這個是支持中文必須要設置的 chinese_dictionary =/usr/local/sphinx/etc/xdict #..........其它可以默認 } index delta_test1: src1 //增量索引{ source = delta_src1 path = /usr/local/sphinx/var/data/delta_src1 }
3、定時任務生成索引(--rotate 參數可以不重啟服務索引就能生效)
a、每天凌晨生成全量索引:./indexer test1 --rotate
b、每10分鐘生成一次增量索引 :./indexer delta_test1 --rotate
本文由用戶 KelDandridg 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!