结合 Github Action 实现自动上传 Algolia 索引

起初本站的文章搜索功能使用是本地搜索支持,但后来发现有众多网友(包括 Hugo 官网文档搜索)都使用的是 Algolia 在线搜索引擎,便顺手也给自己的站点移植到该搜索引擎上面。既然提到搜索引擎自然是少了索引文件的维护,接下来就给大家分享下结合 Github Action 实现自动化的流程。

索引内容

Algolia 采用较为松散的 JSON 数据结构支持,所以实现起来也相对比较轻松一些,也可以根据自己的需求进行个性化的设计。在此就博文查找而言,暂没有做复杂的设计,只是利列举了必要的字段信息,基于 Hugo 引擎的代码参考如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[
  {{- range $index, $entry := where .Site.RegularPages "Kind" "page" }}
  {{- if $index }}, {{ end }}
  {
    "objectID": "{{ .Date.Unix }}",
    "permalink": "{{ .Permalink | relURL }}",
    "title": {{ .Title }},
    "content": {{ .Plain | safeJS }},
    "date": {{ .Date.Format }},
    "updated": {{ .Lastmod.Format }}
  }
  {{- end }}
]
注意: 切记一定要给每个索引增加 objectID 参数,以确保索引的唯一性,而且后续的索引维护也是根据这个参数作为主键进行更新等相应的操作。

这里只是把博文显示的页面进行索引化,并没有对分类、标签、列表等做索引支持,查询的内容只针对文章页面本身就足够用啦。

生成索引

Hugo 支持自定义文件的内容的输出,只需要几步简单的参数定义,比如在 config.yaml 配置文件中加入如下的设置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
outputFormats:
  # 生成 Algolia 索引文件
  AlgoliaIndexes:
    mediaType: application/json
    baseName: algolia
    isPlainText: true
    notAlternative: true

# 输出 Algolia 索引文件
outputs:
  home: ["HTML", "AlgoliaIndexes"]

默认会在 public 目录中输出一个名称为 algolia.json 的索引文件。

自动维护

接下来就是要将上面生成的索引文件上传到 Algolia 服务器,在没有实现自动化支持前,每次都要手动的进行上传很是麻烦。由于站点的代码是托管在 Github 上面,于是便想到了使用 Action 来集成。

发现 Algolia 官方也提供了个 setup-algolia-cli 项目支持,不过很遗憾在使用过程中,发现导入有问题无法解决只好放弃。

1
2
3
4
algolia version 1.2.0
algolia objects import $ALGOLIA_INDEXNAME -F $ALGOLIA_INDEXFILE
bufio.Scanner: token too long
Error: Process completed with exit code 1.

然后就发现 Github 市场中提供 Algolia 上传的 Action 有不少,无奈只能挑几个试试看。经过一番亲自测试下来,觉得 algolia-uploader Algolia-Upload-Records 两款比较好用一些,最终选择了后者集成到本站的 Github Action 步骤中,无他主要是觉得上传后有索引ID输出响应,体验相对会好些而已,Action 脚本代码配置参考如下:

1
2
3
4
5
6
7
- name: Upload Algolia Indexes
  uses: iChochy/Algolia-Upload-Records@main
  env:
    APPLICATION_ID: ${{ secrets.ALGOLIA_APPID }}
    ADMIN_API_KEY: ${{ secrets.ALGOLIA_ADMINKEY }}
    INDEX_NAME: ${{ secrets.ALGOLIA_INDEXNAME }}
    FILE_PATH: "public/algolia.json"

小结

整个过程中也可谓几番波折,原以为官方的文档和资源都是好用的,结果却是出乎意料只好改用第三方的支持。还有一个百思不得其解的问题,就是同样没有 objectID 参数的索引文件,通过官方网站手动上传不会产生重复的索引,而通过 API 形式上传到服务器会不断产生重复的索引。以及说 Github 市场中琳琅满目的第三方插件,有时也是让人难以抉择,只好一步步慢慢尝试,好在最终结果还是喜人的,问题得到了解决。