惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
小众软件
小众软件
The Cloudflare Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
Jina AI
Jina AI
博客园 - 【当耐特】
V
Visual Studio Blog
美团技术团队
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
量子位
IT之家
IT之家
G
Google Developers Blog
V
V2EX
The GitHub Blog
The GitHub Blog
月光博客
月光博客
GbyAI
GbyAI

热爱生活与梦想

迁移LeanCloud的Waline评论数据到TiDB/Neon 25年江浙地区暑假自驾游之感慨 使用阿里云灵码继续完成构建 SSL 证书管理器 亲手给儿子做的棒棒糖摩天轮六一礼物 使用腾讯云 CodeBuddy 构建 SSL 证书管理器 修复代码块默认高度相关缺陷 HugoNexT4.7.2 新功能和升级提示 改善代码块折叠和选中功能 支持Github风格的警告样式 新增音乐短代码功能支持 给文章添加摘要和过期提示功能 回顾24年的过去总结 修复Mathjax行内显示公式的问题 给Hugo文章增加阅读更多跳转的锚点定位功能 Win10隐匿的VPN设置和L2TP连接常见错误 Go语言中“糟糕”的日期时间格式化设计 DaoCloud道客提供的免费Docker镜像代理服务 感谢万能淘宝让自己吃到喜欢的美食 WSL运行时遇到未知异常错误无法使用 隐藏的换行符导致Base64加密解密失败 MySQL自带客户端直接免密登录操作 Linux系统中删除目录软链接的注意项 Java程序调用外网API时CA问题 如何不关机重启WSL2恢复虚拟服务 在Windows上安装Podman容器平台做虚拟化 记一次无法弹出移动硬盘的记录 为友情链接添加自动检测脚本 重新激活Github的2FA认证 Linux中使用tar压缩命令排除文件 继续小米手环的健康生活之旅
结合 Github Action 实现自动上传 Algolia 索引
凡梦星尘 · 2022-10-04 · via 热爱生活与梦想

起初本站的文章搜索功能使用是本地搜索支持,但后来发现有众多网友(包括 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 市场中琳琅满目的第三方插件,有时也是让人难以抉择,只好一步步慢慢尝试,好在最终结果还是喜人的,问题得到了解决。