手動給docusaurus新增一個搜尋

flydean發表於2024-04-18

新版部落格用docusaurus重構已經有些日子了,根據docusaurus的文件上也申請了Algolia,想一勞永逸的解決部落格的搜尋問題。但是流水有意,落花無情。

algolia總是不給我回復,我只能對著algolia的申請頁面仰天長嘆。

正常情況的申請

按照docusaurus官方文件上說的,當我們需要搜尋的時候,開啟https://docsearch.algolia.com/apply/填一下申請,提交就行了。

image-20240412142349147

但是可惜的是,我填好資料,點這個join the program很多次了,就是沒有反應。

怎麼辦呢?我仔細檢查了它的官方文件,看他的描述說是需要等待2個星期。但是2個星期實在太久了,在我們只爭朝夕的今天,怎麼行。

還好,我看到它還有一種手動上傳的辦法,笨是笨了點,總比沒有的好。那就開始吧。

手動上傳

首先我們得去Algolia上註冊一個賬號,然後在這裡需要建立一個應用:

image-20240412143404546

應用的旁邊,需要建立一個index用來儲存搜尋資料:

image-20240412143441586

這樣,前期的準備工作就做好了。

再在api設定中找到APPLICATION_ID和API_KEY。把他們儲存到.env檔案中:

APPLICATION_ID=YOUR_APP_ID
API_KEY=YOUR_API_KEY

注意,這裡的API_KEY最好是Admin API Key,因為會有一些許可權需要。

如果是Admin API Key的話,記得不要分享給別人,這個key的許可權比較大,可以刪除和更新你的index資料。

設定配置檔案

接下來,我們還需要一個配置檔案。用來配置爬蟲資訊。下面是一個最基本的配置資訊。

{
  "index_name": "example",
  "start_urls": ["https://www.example.com/docs"],
  "selectors": {
    "lvl0": "#content header h1",
    "lvl1": "#content article h1",
    "lvl2": "#content section h3",
    "lvl3": "#content section h4",
    "lvl4": "#content section h5",
    "lvl5": "#content section h6",
    "text": "#content header p,#content section p,#content section ol"
  }
}

其中index_name就是我們剛剛在網站上建立的index_name。當DocSearch scraper程式跑起來的時候,你會發現有一個臨時的index_name + _tmp 索引被建立。

別擔心,在程式執行完畢之後,會把這個tmp index會替換最終的index。

start_urls包含的是要開始爬取的連結地址。爬蟲會迴圈爬取連結裡面的a標籤,除非是遇到了stop_urls。另外爬蟲不會爬取其他域名的連結。

selectors是用於建立記錄層次結構的所有 CSS 選擇器。其中text是強制,必須要有的。

如果你對不同的url有不同的selector方案,那麼可以給不同的url配置不同的selectors_key,如下所示:

{
  "start_urls": [
    {
      "url": "http://www.example.com/docs/faq/",
      "selectors_key": "faq"
    },
    {
      "url": "http://www.example.com/docs/"
    }
  ],
  […],
  "selectors": {
    "default": {
      "lvl0": ".docs h1",
      "lvl1": ".docs h2",
      "lvl2": ".docs h3",
      "lvl3": ".docs h4",
      "lvl4": ".docs h5",
      "text": ".docs p, .docs li"
    },
    "faq": {
      "lvl0": ".faq h1",
      "lvl1": ".faq h2",
      "lvl2": ".faq h3",
      "lvl3": ".faq h4",
      "lvl4": ".faq h5",
      "text": ".faq p, .faq li"
    }
  }
}

好了,基本的配置就這些了。

執行爬蟲指令碼

現在可以執行爬蟲指令碼了,這裡有兩個選擇,一是跑docker,方便快捷。二是從原始碼執行,這個就比較麻煩了。

這裡我只是希望部落格可以有搜尋功能,所以原始碼什麼的就算了吧,我們直接跑docker命令:

run -it --env-file=.env -e "CONFIG=$(cat flydean.conf | jq -r tostring)" algolia/docsearch-scraper

過一會就執行起來了。但是我們看看日誌:

DocSearch: http://www.flydean.com/07-python-module/ 0 records)
DocSearch: http://www.flydean.com/08-python-io/ 0 records)
DocSearch: http://www.flydean.com/09-python-error-exception/ 0 records)
DocSearch: http://www.flydean.com/06-python-data-structure/ 0 records)

Crawling issue: nbHits 0 for myblog

nb_hits表示的是DocSearch 提取和索引的記錄數。

怎麼是0 records?難道什麼都沒有爬到?

直覺是我的start_urls不太對,我們把它換成sitemap.xml再試一次:

{
  "sitemap_urls": ["http://www.example.com/docs/sitemap.xml"]
}

還是同樣的錯誤。

沒辦法,再去仔細讀一下配置檔案的說明。

終於發現了問題,原來這裡的selectors寫的有問題,#content header h1表示的是在ID為content的元素內部,尋找所有屬於header類的元素,並在這些元素內部尋找所有的<h1>元素。但是在docusaurus V3版本中已經發生了變化。

我們把它改寫成這樣:

  "selectors": {
    "lvl0": {
      "selector": ".menu__link--sublist.menu__link--active",
      "global": true,
      "default_value": "Documentation"
    },
    "lvl1": "header h1",
    "lvl2": "article h2",
    "lvl3": "article h3",
    "lvl4": "article h4",
    "lvl5": "article h5",
    "lvl6": "article h6",
    "text": "article p, article li"
  },

再執行一次,這次終於有資料了。

回到網站上看看,已經有資料上傳上來了:

image-20240412153529110

好了,我們在docusaurus.config.ts中配置一下,看看效果:

algolia: {
        // The application ID provided by Algolia
        appId: 'YOUR_APP_ID',
        // Public API key: it is safe to commit it
        apiKey: 'YOUR_SEARCH_API_KEY',
        indexName: 'YOUR_INDEX_NAME',
        // Optional: see doc section below
        contextualSearch: true,
        // Optional: Algolia search parameters
        searchParameters: {},
        // Optional: path for search page that enabled by default (`false` to disable it)
        searchPagePath: 'search',
        //... other Algolia params
      },

我們在網站上試試效果:

image-20240412165018633

完美,遇到問題的小夥伴可以私信我喲!

點我檢視更多精彩內容:www.flydean.com

相關文章