search 模塊是用于支持對 cms 中允許進行全文搜索的內容進行全文搜索。
全文搜索的內部實現是使用 MySQL MyISAM 表的全文搜索索引,數據表為 search(eg. phpcms2008_search).
search 表只有三個字段:searchid,type,data.
searchid 是自動編號主鍵,type 表示內容的類型,比如是屬于新聞還是屬于產品等,data 是加了全文搜索索引的字段,字段值為被被分詞后的內容.
一篇文章內容可以被全文搜索的流程是這樣的:
內容主表(content)建有 searchid 字段,與 search 表的 searchid 字段關聯,一篇文章在 search 表的 type 字段值就是文章所屬模型的表名,如模型表名為 phpcms2008_c_news 則模型文章的全文搜索 type 字段值為 news.
執行添加文章的代碼是 /include/admin/content.class.php 的 add() 方法,里面調用 log_write() 方法,log_write 調用 search_api 方法,search_api 方法就是建立全文搜索索引的.
search_api 方法會根據文章是否有 searchid 字段值決定是新加還是更新 search 表的記錄,添加文章時因為沒有 searchid 字段值,所以必定是添加 search 表的記錄,再根據文章 status 狀態值決定是添加或更新全文搜索數據還是刪除全文搜索數據,當文章非審核通過狀態時執行的便是刪除全文搜索數據.
若是添加或更新,下面簡稱為寫入,全文搜索時,會把需要搜索的內容查出,比如文章標題,文章內容,文章關鍵詞等.
之后便調用 search 模塊的接口 /search/include/search.class.php 的 add() 方法,更新時為 update() 方法,寫入全文搜索數據,并把接口返回的 searchid 寫到此文章的 searchid 字段值中.
在 /search/include/search.class.php 的 add() 方法中,會把全文搜索內容進行分詞,保存到 search 表的 data 字段中,再把作為數組類型保存的文章原始數據緩存到 /search/data/ 目錄中.
當前臺用戶提交全文搜索請求時,先從 search 表查出符合條件的記錄的 searchid, type 值,然后讀取對應的 /search/data/ 緩存數據,便可在頁面顯示搜索結果.
一般搜索結果頁需要顯示結果的標題,url,簡單,圖片這些基本信息,所以每條全文搜索數據都會把結果頁顯示用到的信息緩存到 /search/data/ 的緩存文件中.
|
新聞熱點
疑難解答