搜尋功能介紹

早期使用聖經程式時,最重視的就是搜尋的功能,最先作的也是搜尋功能,其實聖經作搜尋功能並不困難,因為聖經只有三萬多節,每一節當作一行資料,要比對其中有沒有出現某個字串,就只要比較三萬多次,現在的電腦速度很快,比對三萬多次所花的時間是很短的。大部份線上搜尋所花的時間都是網路傳輸的時間。

我一開始寫了搜尋功能之後,後來常常修改搜尋的功能,剛開始都是將舊的程式拿掉,後來慢慢發現將新舊程式都留著比較好,因為人都會喜歡自己已經習慣了的程式,雖然新的程式功能應該會比較強,但我發現舊的程式使用的人還是很多。現在我的網頁上至少就有三個搜尋的介面()、三個閱讀()的介面。只是我自己後來都只維護最新的程式,要維護很多份程式負擔實在是很大。

原來的搜尋程式只能尋找某個字串是否出現在某節經文中,後來我用 compiler 書中提到的 operator-precedence parsing 將 and 與 or 加進來,使得後來的搜尋程式可以尋找同時出現某些字串的經文,其實只要是 and 與 or 的任何邏輯組合式子都可以作,只是當時很懶惰,所以沒有將 not 的功能同時加入。新版的搜尋程式就有將 not 的功能加入,我用 & 或 * 代表 and、用 | 或 + 代表 or、用 ! 代表 not。

新版的系統中因為有多個聖經版本,我就想到希望能夠切換多個版本的搜尋結果,例如:可以尋找中文聖經中出現「永生」的經節之英文版本,所以我就將搜尋出來的經節存在暫存檔中,可以作任意版本聖經的切換。只是在作這功能時遇到一個問題,就是每個版本聖經章節不完全一樣,中文和合本與英文 KJV 至少有三處不同,而英文 Basic English Version 的差異更大,所以我存經節時,是存「第幾卷書的第幾節」(不是第幾章的第幾節哦),因為不同版本的聖經切章的時候,不完全一樣(還好章數都一樣),這樣作在切換不同版本的查詢結果誤差應該會小一點,但難免還是會有誤差。我想除非將每一種版本的經節弄成完全一樣,否則要作到完全沒有誤差是很困難的。

作搜尋時還有一個功能是「字串變色」的部份,將所找到的字串變成另一種顏色(我是變成紅色),這樣比較容易看到所要找的字串在哪裡。因為我是將所搜尋到的經節先存在暫存檔中,顯現結果時,再從暫存檔讀出來顯現,因此要將所找的字串變顏色時,就必須將這些字串也都存到暫存檔裡面,因此我的暫存檔有檔頭,放了一些重要的資訊(就是 bible2.h 裡面的 searchheader,再加上一個 table),因此搜尋時變顏色就不是問題,甚至連閱讀時也可以變顏色,閱讀字典內容也同樣可以變顏色。

我在寫搜尋程式時,想到一些使程式執行速度加快的方法,就是將每個字串是否出現在經文的情形全算出來作成 table(這個 table 也存在暫存檔中的檔頭),之後檢查每節經文是否為所要找的經文時,只要檢查每個字串是否出現在經文中,之後查表即可知道此經文是否符合條件。這樣作 parsing 的次數就為字串的指數次,而不是經文的三萬多次。但由於這個 table 的格子數是字串的指數(若所要查詢的是「(永生|全能)*(神|耶和華)」,字串數為 4,table 中的格子數就為 2^4 = 16 個),因此字串的個數是有限制的,不然 table 會變得太大,我目前的限制是:最多十個字串,因為我的 table 只設了 1024 個格子。

實際上我的搜尋程式功能比所看到的更強一點,因為它其實可以作跨版本的搜尋,例如:可以查中文聖經出現永生、且英文聖經出現 everlasting 的經文,其輸入方式為「永生[0]&everlasting[1]」或「永生[0]&everlasting[2]」,有時會在想這種功能不知有沒有實際的用處,所以還沒有作得很完備(變色的部份還怪怪的),但至少是可以使用的。

目前搜尋的部份還有些問題暫時還沒有解決,例如:跨版本的搜尋時,字串中可否留空格的問題還沒有解決,這應該是可以解決的,只是還沒有作。

另外,我很想作的是「以章為單位」的搜尋,以章為單位就可以將搜尋的結果按「正確性」來排序,只是這麼作的話,我前面用 table 的方式也許就變得行不通了,這必須再想清楚。

這個寒假就要結束了,不知還能不能再加其他功能,若來不及加的話,就必須等到暑假再來增加功能了。

回前言 歷史回顧版權宣言可移植性可擴增性與其他單位合作的方式經費與自由奉獻 可記錄讀經進度的方法 搜尋功能介紹 回首頁