sphinx 增量索引 實現實時更新

2021-07-14 18:09:32 字數 4690 閱讀 3145

一.sphinx增量索引的設定

資料庫中的已有資料很大,又不斷有新資料加入到資料庫中,也希望能夠檢索到。全部重新建立索引很消耗資源,因為我們需要更新的資料相比較而言很少。例如。原來的資料有幾百萬條,而新增的只是幾千條。這樣就可以使用「主索引+增量索引」的模式來實現近乎實時更新的功能。

這個模式實現的基本原理是設定兩個資料來源和兩個索引,為那些基本不更新的資料建立主索引,而對於那些新 增的資料建立增量索引。主索引的更新頻率可以設定的長一些(例如設定在每天的午夜進行),而增量索引的更新頻率,我們可以將時間設定的很短(幾分鐘左 右),這樣在使用者搜尋的時候,我們可以同時查詢這兩個索引的資料。

使用「主索引+增量索引」方法有個簡單的實現,在資料庫中增加乙個計數表,記錄每次重新構建主索引時,被索引表的最後乙個資料id,這樣在增量索引時只需要索引這個id以後的資料即可,每次重新構建主索引時都更新這個表。

測試條件:以預設的sphinx.conf配置為例,資料庫表的資料也以 example.sql為例。

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

// 注意:delta_src 中的sql_query_pre的個數需和main_src 對應,否則可能搜尋不出相應結果

source delta_src: main_src

index main //主索引

//delta可全部複製主索引,然後更改source 和path如下

index delta: main //增量索引

其它的配置可都用預設的,如果你設定了分布式檢索的索引,那麼更改下對應的索引名稱即可。

3.重新建立索引:

如果sphinx正在執行,那麼首先停止執行,然後,根據sphinx.conf配置檔案來建立所有索引,最後,啟動服務

/usr/local/sphinx/bin/searchd --stop/usr/local/sphinx/bin/indexer -c  /usr/local/sphinx/etc/sphinx.conf --all/usr/local/sphinx/bin/searchd -c  /usr/local/sphinx/etc/sphinx.conf

p.s /usr/local/sphinx/bin/indexer -c  /usr/local/sphinx/etc/sphinx.conf --all --rotate

這樣就不需要停searchd,索引後也不再需要重啟searchd了。

如果想測試增量索引是否成功,往資料庫表中插入資料,查詢是否能夠檢索到,這個時候檢索應該為空,然後,單獨重建 delta索引

/usr/local/sphinx/bin/indexer -c /usr/lcoal/sphinx/etc/sphinx.conf delta

檢視是否將新的記錄進行了索引。如果成功,此時,再用 /usr/local/sphing/bin/search 工具來檢索,能夠看到,在main索引中檢索到的結果為0,而在delta中檢索到結果。當然,前提條件是,檢索的詞,只在後來插入的資料中存在。

接下來的問題是如何讓增量索引與主索引合併

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

到現在為止,如果指令碼寫的沒有問題,那麼build_delta_index.sh將每30分鐘執行一次,而build_main_index.sh將在凌晨2:30分才執行。

要驗證的話,在指令碼中,有將輸出重定向到相關的檔案,可以檢視下檔案中的記錄是否增多,也可以看下 /usr/local/sphinx/var/log下的 searchd.log 中,每次重建索引都會有記錄。

總結1.索引合併問題,前面已經解釋過,兩個索引合併時,都要讀入,然後還要寫一次硬碟,io操作量很大。而在php api呼叫時,query($query,$index)中$index可以設定多個索引名,如query($query,"main;delta"),也就沒有必要一定將兩個索引合併,或者,合併的次數不用那麼多。

2.還有乙個是沒有嘗試過的,把增量索引存放到共享記憶體中(/dev/shm)以提高索引效能,減少系統負荷。關於php api

如何能夠順利通過php頁面來進行檢索。

首先,在伺服器上searchd 必須是執行的。

然後,根據test.php來修改下。

執行,連線時會出現乙個很大的問題 errno =13 permission deny. 最後,查到乙個英文的網頁,是因為selinux的原因,關於selinux在網上能搜到。沒有很好的解決辦法,只能把selinux設定為不用。使用的命令有下面兩個: setenforce 在 /usr/bin 下

setenforce 1 設定selinux 成為enforcing模式

setenforce 0 設定selinux 成為permissive模式

sphinx 增量索引實現例項

sphinx 斯芬克司 sphinx是乙個基於sql的全文檢索引擎,可以結合mysql,postgresql做全文搜尋,它可以提供比資料庫本身更專業的搜尋功能,使得應用程式更容易實現專業化的全文檢索.sphinx的主要特性包括 高速索引 在 cpu上,近10 mb 秒 高速搜尋 2 4g的文字量中平...

sphinx 增量索引 實現近實時更新

一.sphinx增量索引的設定 資料庫中的已有資料很大,又不斷有新資料加入到資料庫中,也希望能夠檢索到。全部重新建立索引很消耗資源,因為我們需要更新的資料相比較而言很少。例如。原來的資料有幾百萬條,而新增的只是幾千條。這樣就可以使用 主索引 增量索引 的模式來實現近乎實時更新的功能。這個模式實現的基...

sphinx主索引和增量索引實時更新

在資料庫資料非常龐大的時候,而且實時有新的資料插入,如果我們不更新索引,新的資料就search不到,全部重新建立索引又很消耗資源,在這種情況下我們就需要使用 主索引 增量索引 的思路來實現實時更新的功能。因為這時我們有了主索引和增量索引,主索引只需在每天凌晨更新,而增量索引的更新頻率設定的很短,這樣...