本發(fā)明涉及一種數(shù)據(jù)庫的檢索方法,特別涉及一種可實(shí)現(xiàn)高性能數(shù)據(jù)庫最終一致性的全文檢索方法。
背景技術(shù):
在全球,新型分布式數(shù)據(jù)庫存在多種不同的技術(shù)產(chǎn)品,例如:MongoDB、Cassandra、HBase等。國內(nèi)則包括SequoiaDB巨杉數(shù)據(jù)庫,阿里巴巴的OceanBase等。這些數(shù)據(jù)庫的核心功能都是記錄的存儲(chǔ)與檢索。
一般來說,數(shù)據(jù)庫的精確檢索機(jī)制包括對字段的等于、大于小于、大于等于、小于等于、不等于等操作,而模糊查詢一般支持SQL的LIKE機(jī)制或正則表達(dá)式。在執(zhí)行效率上,模糊查詢的效率遠(yuǎn)遠(yuǎn)低于建立好索引的精確檢索,這是由于大部分?jǐn)?shù)據(jù)庫使用樹形索引、或bitmap索引,對于支持模糊檢索的倒排索引支持不多。
在現(xiàn)有應(yīng)用程序中支持全文檢索有兩種形式:一種形式是在業(yè)務(wù)端以雙寫的方式,一方面向數(shù)據(jù)庫寫入記錄,得到返回結(jié)果中的記錄ID后,再向搜索引擎寫入一次。這樣搜索引擎就有了一個(gè)記錄ID,全文檢索出ID后再從數(shù)據(jù)庫查一遍,這樣就可得到最終的檢索結(jié)果。這種做法雖然簡單、方便,但可能造成存儲(chǔ)數(shù)據(jù)的不一致性,尤其是在并發(fā)存在的場景下很容易出現(xiàn)多個(gè)任務(wù)對同一條記錄進(jìn)行更改,造成搜索引擎和數(shù)據(jù)庫產(chǎn)生不一致。最壞情況下,如果應(yīng)用服務(wù)器在寫入數(shù)據(jù)庫后崩潰,沒有來得及寫入到搜索引擎中,那么搜索引擎就會(huì)檢索不到這條記錄,造成檢索失敗。另一種形式是在數(shù)據(jù)庫內(nèi)部直接實(shí)現(xiàn)倒排索引,但開發(fā)和維護(hù)難度則大大增加,后期使用成本和使用復(fù)雜性高,普及性差。
如何改善這一情況,開發(fā)一種針對高性能數(shù)據(jù)庫的全文檢索模式,就成為本發(fā)明所要解決的問題。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述現(xiàn)有情況和不足,本發(fā)明旨在提供一種在不直接實(shí)現(xiàn)內(nèi)置倒排索引的前提下,結(jié)合數(shù)據(jù)庫內(nèi)部處理機(jī)制,實(shí)現(xiàn)數(shù)據(jù)庫與第三方搜索引擎之間的數(shù)據(jù)同步,并利用第三方搜索引擎可靠、穩(wěn)定的實(shí)現(xiàn)高性能數(shù)據(jù)庫最終一致性的全文檢索方法,以消除現(xiàn)有傳統(tǒng)雙寫機(jī)制帶來的穩(wěn)定性和一致性差的問題,大幅提升檢索性能,保證檢索質(zhì)量。
本發(fā)明的目的是利用搜索引擎進(jìn)行全文檢索,而如何設(shè)計(jì)數(shù)據(jù)庫內(nèi)部的數(shù)據(jù)處理流程,確保數(shù)據(jù)庫與搜索引擎之間的安全交互,確保即使在數(shù)據(jù)切分、節(jié)點(diǎn)崩潰、網(wǎng)絡(luò)異常等情況下也不會(huì)出現(xiàn)問題,確保數(shù)據(jù)庫引擎與搜索引擎之間的數(shù)據(jù)一致性和同步性,且對于應(yīng)用程序做到完全透明,都是本發(fā)明所述方法需要考慮和解決的問題。
本發(fā)明是通過以下技術(shù)方案來實(shí)現(xiàn)的:
一種實(shí)現(xiàn)高性能數(shù)據(jù)庫最終一致性全文檢索的方法,具體步驟包括:
步驟1、將搜索引擎通過連接器與數(shù)據(jù)庫連接。
步驟2、當(dāng)數(shù)據(jù)寫入數(shù)據(jù)庫后記錄入一個(gè)臨時(shí)循環(huán)日志文件中,臨時(shí)循環(huán)日志文件中包括有需要索引的字段內(nèi)容以及記錄的ID。
步驟3、使用數(shù)據(jù)庫內(nèi)的工具順序讀取臨時(shí)循環(huán)日志文件,并根據(jù)對臨時(shí)循環(huán)日志文件的操作通過連接器將相應(yīng)需要檢索的字段內(nèi)容寫入到搜索引擎中,同時(shí),工具記錄已完成索引的臨時(shí)循環(huán)日志文件偏移。
步驟4、工具根據(jù)已完成索引的臨時(shí)循環(huán)日志文件偏移,持續(xù)讀取臨時(shí)循環(huán)日志文件直到最后,并將每次操作的相應(yīng)內(nèi)容通過連接器寫入到搜索引擎中,完成搜索引擎內(nèi)數(shù)據(jù)的建立。
步驟5、工具監(jiān)聽后續(xù)數(shù)據(jù)到來,如有數(shù)據(jù)來到,重復(fù)上述步驟4;否則,繼續(xù)步驟6。
步驟6、通過搜索引擎鍵入要檢索的關(guān)鍵字,得到返回的主鍵ID,將主鍵ID通過連接器輸入到數(shù)據(jù)庫,并通過連接器讀取該主鍵ID對應(yīng)的數(shù)據(jù)庫記錄,完成全文檢索。
所述步驟2還包括:如果數(shù)據(jù)在寫入臨時(shí)循環(huán)日志之前數(shù)據(jù)庫發(fā)生故障,在下次數(shù)據(jù)庫恢復(fù)時(shí)進(jìn)行回滾,完成數(shù)據(jù)庫和臨時(shí)循環(huán)日志文件的建立。
所述步驟3還包括:如果在讀取臨時(shí)循環(huán)日志文件時(shí)連接器發(fā)生故障,數(shù)據(jù)庫重啟后,工具根據(jù)已完成索引的臨時(shí)循環(huán)日志文件偏移讀取后續(xù)日志內(nèi)數(shù)據(jù)并寫入到搜索引擎中。
所述步驟3還包括:如果工具在寫入搜索引擎后、更新偏移前崩潰,數(shù)據(jù)庫重啟,工具根據(jù)之前記錄的最后成功偏移重新讀取相應(yīng)的臨時(shí)循環(huán)日志文件的內(nèi)容并寫入到搜索引擎中,具體寫入過程包括:如工具為INSERT操作,此操作被工具端忽略;如工具為UPDATE操作,此操作被確認(rèn)執(zhí)行;如工具為DELETE操作,此操作被工具端忽略。
所述步驟2中,字段內(nèi)容包括:一個(gè)作為記錄指針的記錄RID,包括數(shù)據(jù)頁和偏移,一個(gè)代表增刪改操作的操作符和一個(gè)相對于增改操作需要索引的全文字段的長字符串。
本發(fā)明所述一種實(shí)現(xiàn)高性能數(shù)據(jù)庫最終一致性全文檢索的方法的有益效果包括:
1、有效實(shí)現(xiàn)了搜索引擎內(nèi)數(shù)據(jù)內(nèi)容與數(shù)據(jù)庫中需要進(jìn)行全文檢索字段內(nèi)容的一致性,保證了檢索過程的準(zhǔn)確性,提高了檢索效率。
2、全面消除和克服了數(shù)據(jù)建設(shè)和傳送過程中可能出現(xiàn)的各種問題,保證了數(shù)據(jù)庫以及搜索引擎中數(shù)據(jù)建立的完整性和準(zhǔn)確性。
3、搜索引擎對業(yè)務(wù)完全透明,業(yè)務(wù)不需要進(jìn)行雙寫,僅需要寫入數(shù)據(jù)庫后即可返回,簡化了數(shù)據(jù)建立和使用過程。
4、避免了數(shù)據(jù)庫內(nèi)部直接使用倒排索引方式帶來的開發(fā)和維護(hù)難度大的問題以及傳統(tǒng)雙寫模式帶來的穩(wěn)定性差的弊端。
具體實(shí)施方式
本發(fā)明的中心思想是:通過對臨時(shí)循環(huán)日志文件復(fù)制的方式,使數(shù)據(jù)庫與搜索引擎的數(shù)據(jù)保持最終一致,為搜索引擎的正常、準(zhǔn)確搜索提供支持。
本發(fā)明所述的一種實(shí)現(xiàn)高性能數(shù)據(jù)庫最終一致性全文檢索的方法,具體步驟包括:
步驟1、將搜索引擎通過連接器與數(shù)據(jù)庫連接。
連接器作為一個(gè)獨(dú)立運(yùn)行的進(jìn)程,隨著數(shù)據(jù)庫的啟動(dòng)而啟動(dòng),并作為傳輸通道將數(shù)據(jù)庫與搜索引擎聯(lián)系在一起。
步驟2、當(dāng)數(shù)據(jù)寫入數(shù)據(jù)庫后記錄入一個(gè)臨時(shí)循環(huán)日志文件中,臨時(shí)循環(huán)日志文件中包括有需要索引的字段內(nèi)容以及記錄的ID,字段內(nèi)容包括:一個(gè)作為記錄指針的記錄RID,包括數(shù)據(jù)頁和偏移;一個(gè)代表增刪改操作的操作符;一個(gè)相對于增改操作需要索引的全文字段的長字符串。其中,如果數(shù)據(jù)在寫入臨時(shí)循環(huán)日志之前數(shù)據(jù)庫發(fā)生故障,則在下次數(shù)據(jù)庫恢復(fù)時(shí)進(jìn)行回滾,完成數(shù)據(jù)庫和臨時(shí)循環(huán)日志文件的建立。
當(dāng)然,如果數(shù)據(jù)庫在工具讀取臨時(shí)循環(huán)日志文件之后故障,則數(shù)據(jù)庫與搜索引擎中均會(huì)存在該記錄。由于工具是獨(dú)立進(jìn)程,所以不需要做特殊處理。
步驟3、使用數(shù)據(jù)庫內(nèi)的工具順序讀取臨時(shí)循環(huán)日志文件,并根據(jù)對臨時(shí)循環(huán)日志文件的操作通過連接器將相應(yīng)需要檢索字段的內(nèi)容寫入到搜索引擎中,同時(shí),工具記錄已完成索引的臨時(shí)循環(huán)日志文件偏移。如果在讀取臨時(shí)循環(huán)日志文件時(shí)連接器發(fā)生故障,即傳送通道發(fā)生故障,則數(shù)據(jù)庫重啟后,工具根據(jù)已完成索引的臨時(shí)循環(huán)日志文件偏移讀取后續(xù)日志內(nèi)數(shù)據(jù)并寫入到搜索引擎中;如果工具在寫入搜索引擎后、更新偏移前崩潰,則內(nèi)容已被寫入搜索引擎中,而偏移則無記錄,此時(shí)數(shù)據(jù)庫重啟,工具根據(jù)之前記錄的最后成功偏移重新讀取相應(yīng)的臨時(shí)循環(huán)日志文件的內(nèi)容并寫入到搜索引擎中,其具體寫入過程包括:如工具為INSERT操作,由于增加的內(nèi)容已被寫入到搜索引擎中,此操作被工具端忽略;如工具為UPDATE操作,由于更新的內(nèi)容已被寫入到搜索引擎中,再做一次更新,此操作被確認(rèn)執(zhí)行;如工具為DELETE操作,由于搜索引擎中相應(yīng)內(nèi)容已被刪除,再進(jìn)行刪除時(shí)將找不到相應(yīng)內(nèi)容,故此操作被工具端忽略。
步驟4、工具根據(jù)已完成索引的臨時(shí)循環(huán)日志文件偏移,持續(xù)讀取臨時(shí)循環(huán)日志文件直到最后,并將每次操作的相應(yīng)內(nèi)容通過連接器寫入到搜索引擎中,完成搜索引擎內(nèi)數(shù)據(jù)的建立。
此時(shí)搜索引擎內(nèi)數(shù)據(jù)內(nèi)容與數(shù)據(jù)庫中需要進(jìn)行全文檢索字段的內(nèi)容保持一致,為后續(xù)準(zhǔn)確檢索提供了依據(jù)。
步驟5、工具繼續(xù)監(jiān)聽后續(xù)的數(shù)據(jù)到來,如有數(shù)據(jù)來到,重復(fù)上述步驟4;否則,繼續(xù)步驟6。
步驟6、通過搜索引擎鍵入要檢索的關(guān)鍵字,得到返回的主鍵ID,將主鍵ID通過連接器輸入到數(shù)據(jù)庫,并通過連接器讀取該主鍵ID對應(yīng)的數(shù)據(jù)庫記錄,全文檢索完成。
整個(gè)過程在數(shù)據(jù)庫內(nèi)工具的幫助下,在連接器的支持下,通過臨時(shí)循環(huán)日志文件的建立,使搜索引擎內(nèi)的數(shù)據(jù)內(nèi)容始終與數(shù)據(jù)庫中需要進(jìn)行全文檢索字段的內(nèi)容保持一致,保證了檢索過程的準(zhǔn)確性,提高了檢索效率。