ExSearch - 為Typecho帶來實時搜索體驗的插件

    這款Typecho插件能夠有效的加強Typecho的搜索體驗,給您的訪客門一個舒適的搜索體驗。

    Type-cho 中沒有單獨的搜索頁,絕大多數主題的所謂「搜索頁」只是為搜索框單獨寫了一個樣式,具體的搜索還是靠頁面跳轉。我對 Type-cho 的搜索從來沒有滿意過,因此這次我想辦法將其增強。

    我需要為 Type-cho 添加搜索實時響應、高亮與預覽功能。澤澤的搜索插件通過 hack Type-cho 的內部方法實現了高亮與過濾功能,但是仍然不能實現實時響應。其實也能理解,如果跟隨輸入實時響應的話,數據庫的壓力大大增加,而且網絡壓力也大大增加。必須另辟蹊徑。

    Hexo 這樣無后端的博客為我提供了新的思路:將內容靜態化,使搜索在前端進行。這樣不僅降低了數據庫壓力,節省了網絡請求數,同時也不用與 Type-cho 的內部方法作斗爭。唯一的缺點是對內容過多的站點來說需要傳輸一定數量的內容到前端,但這通過緩存靜態化與前端長緩存也能緩解。

    ExSearch - 為Typecho帶來實時搜索體驗的插件

    使用

    • 下載頁底提供的文件
    • 解壓文件夾,并將文件夾重命名為 ExSearch
    • 上傳至插件目錄,在后臺啟用
    • 保存一次插件設置,并點擊重建索引。

    在主題中,在任何可點擊的元素上加上?class="search-form-input",點擊即可喚起搜索框。

    自定義 hook

    默認的,點擊搜索結果時會直接跳轉至對應的頁面,但是若你的主題使用了 AJAX 或者 PJAX 技術,你可能需要使用自定義的鉤子來處理點擊事件(例如發起一次 PJAX 操作)。在頁面中插入一個函數如下:

    <script>
    function ExSearchCall(item){
        // your code
    }
    </script>

    其中,item?是一個 JQuery 對象。舉例:

    function ExSearchCall(item){
        if (item && item.length) {
            $('.ins-close').click(); // 關閉搜索框
            let url = item.attr('data-url'); // 獲取目標頁面 URL
            $.pjax({url: url, 
                container: '#pjax-container',
                fragment: '#pjax-container',
                timeout: 8000, }); // 發起一次 PJAX 請求
        }
    }

    可能的問題

    如果你的站點內容過多導致建立索引失敗,請在 Plugin.php 第 136 行左右的位置,取消下面兩行的注釋:

    $sql = 'SET GLOBAL max_allowed_packet=4294967295;';
    $db->query($sql);

    注意,這需要高級權限。你也可以手動對數據庫執行:

    mysql > SET GLOBAL max_allowed_packet=4294967295;

    Credit

    本項目靈感來源于?Wikitten?與?PPOffice,感謝。

    補充:

    插件具體的實現原理是:

    1. 插件中生成整個數據庫文章的json數據(并使用typecho的鉤子可以保證在發表新文章、修改文章中時候同步更新數據),這個數據有兩種方式存儲(文件形式,數據庫)
    2. 博客打開的時候就會加載到這個json數據到前端
    3. 搜索的時候直接拿這個json數據進行匹配就可以了

    但我把代碼用到我的博客上的時候,出現了一些問題。


    當文章數目很多的時候(我的博客目前是217篇文章),生成的json數據大小是很大的,我生成之后是1.9M的大小,使用jquery的 getjson方法很耗時(我測試是19s,和服務器有關,雖然不阻礙頁面渲染)

    于是產生兩個問題:

    1. 在json數據在請求的這個過程中,搜索功能是沒辦法用的
    2. json數據過大造成的流量問題

    (熊貓小A是一打開博客就開始請求這個json文件,我個人覺得搜索其實并不是一個常用功能,所以我是點擊搜索框才開始請求這個json數據)


    當然上面兩個問題不是特別大的問題。

    但是如果你的博客的文章非常之多!這個json數據會很大,導致的請求讀取時間就可能非常長了,而且造成不必要的流量加載。


    我的解決方法是:前端不要一次性加載整個文章的json數據,而是通過php使用SEESION變量存儲讀取緩存的json數據

    if ($_SESSION['search_cache'] === false){
                $object['status'] = false;
                //這部分如果數據是存儲在數據庫中,就從數據庫中讀取,我這里是從緩存文件中讀取
                $filePath = __TYPECHO_ROOT_DIR__ . __TYPECHO_PLUGIN_DIR__ . DIRECTORY_SEPARATOR.'Handsome'.DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR.'search.json';
                $file = file_get_contents($filePath);
                if ($file === false){
                    $fail = "{}";
                    $_SESSION['search_cache'] = $fail;
                    echo $fail;
                }else{
                    $_SESSION['search_cache'] = $file;
                }
            }else{
                $object['status'] = true;
            }
            
            //處理搜索數據,返回結果
            ...

    通過監控輸入框的值,不斷發起ajax請求,后端直接使用SEESION變量的值進行返回結果就可以。

    優點: 多次搜索,只需要一次讀取文件的消耗(之后使用SEESION變量)
    缺點: 多次搜索會有多次ajax請求(但這個ajax請求不會讀數據庫,也不會讀文件,總體來說消耗是非常小的,所以速度也是很快的)

    (之前實現也是監控輸入值發起ajax請求,只不過每次ajax請求都會操作數據庫,這個速度很慢)

    當然這種方法也只是一種權衡罷了,畢竟ajax請求再快也會受服務器是否阻塞和網絡原因影響,而一開始就加載好全部的json數據則真正達到“即時搜索”。

    關于搜索的問題,也許這個Typecho插件能夠幫助到您:

    ExSearch - 為Typecho帶來實時搜索體驗的插件-Npcink
    ExSearch - 為Typecho帶來實時搜索體驗的插件-Npcink

    Soso - 搜索增強Typecho插件

    下載權限
    查看
    • 免費下載
      評論并刷新后下載
      登錄后下載
    • {{attr.name}}:
    您當前的等級為
    登錄后免費下載登錄 小黑屋反思中,不準下載! 評論后刷新頁面下載評論 支付以后下載 請先登錄 您今天的下載次數(次)用完了,請明天再來 支付積分以后下載立即支付 支付以后下載立即支付 您當前的用戶組不允許下載升級會員
    您已獲得下載權限 您可以每天下載資源次,今日剩余
    Typecho

    Hermit - 文字類Typecho博客主題

    2020-4-1 14:41:20

    Typecho

    DoubanBoard - 顯示豆瓣書單的Typecho插件

    2020-4-1 16:49:13

    ??
    Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
    無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
    2 條回復 A文章作者 M管理員
    1. 您好 您的exsearch非常好用 但是搜索時關鍵詞如果在標題中 雖然文章可以正常搜索 但標題中的關鍵詞卻并不高亮 請問有解決方法嗎

      • 插件我是轉載的,可以嘗試問問作者看看。

    ?
    個人中心
    購物車
    優惠劵
    今日簽到
    有新私信 私信列表
    搜索
    主站蜘蛛池模板: 日韩综合无码一区二区| 国模少妇一区二区三区| 天天爽夜夜爽人人爽一区二区| 色一情一乱一伦一区二区三欧美| 青娱乐国产官网极品一区 | 国产电影一区二区| 色一情一乱一伦一区二区三区| 久久精品无码一区二区无码| 国产成人精品一区二三区 | 日本高清一区二区三区| 一区二区乱子伦在线播放| 福利电影一区二区| 乱码人妻一区二区三区| 亚洲福利一区二区精品秒拍| 精品人体无码一区二区三区| 最新中文字幕一区二区乱码| 香蕉久久一区二区不卡无毒影院 | 久久久国产精品亚洲一区 | 日韩成人无码一区二区三区| 无码一区二区三区在线观看| 亚洲片国产一区一级在线观看| 国产成人高清亚洲一区91| 国产SUV精品一区二区四| av无码免费一区二区三区| 色欲综合一区二区三区| 高清一区二区三区日本久| 国产在线精品一区二区在线观看 | 亚洲AV无码一区二区一二区| 亚洲一区二区三区四区在线观看| 国产午夜精品一区二区三区不卡 | 国产一区二区三区乱码在线观看| 无码人妻精品一区二区蜜桃网站 | 99久久国产精品免费一区二区 | 精品一区二区三区免费毛片| 尤物精品视频一区二区三区 | 一区二区三区人妻无码 | 免费视频一区二区| 中文字幕在线一区二区在线| 久久一区二区三区精华液使用方法| 亚洲国产成人久久一区二区三区| 天天综合色一区二区三区|