Hexo:next主题使用Algolia增加搜索功能

Algolia

Algolia是一家美国的创业公司,通过SaaS(软件即服务)模式提供网络搜索产品。Algolia使用外部托管的搜索引擎为客户的网站提供网络搜索服务。产品只需索引客户的网站里的内容,因此搜索任务要简单得多。

Algolia还会通过各种API提供其搜索服务。Rest API提供了搜索、分析和监视三个基本功能,有10种计算机语言和平台可供客户端使用,包括Java、iOS和Android。为了更好的在Web端使用,Algolia集成了四个框架——Ruby on Rails、Symfony、Django和Laravel。Algolia还提供一些UI库选项来让用户选择他们喜欢的用户界面。除了这些产品,Algolia还与其他开源和第三方软件集成了Wordpress和Magento等服务。

搭建Algolia搜索

注册Algolia

前往 Algolia 注册页面,注册一个新账户。 可以使用 GitHub 或者 Google 账户直接登录,注册后的 14 天内拥有所有功能(包括收费类别的)。之后若未续费会自动降级为免费账户,免费账户 总共有 10,000 条记录,每月有 100,000 的可以操作数。

注册完成后,创建一个新的 Index,记住这个 Index 名称将在后面使用。

获取API Key

打开DashBoard–>API Keys–>All API Keys,点击右上角New API Key。(这个路径可能有变化,需要看Algolia有没有更新前端)

在Creat API Key中,Description随便填写描述,Indeices下拉选择刚刚新建的Index Name,其他几个不用关心,最下方ACL中选择search addObject deleteObject deleteIndex和listindexes。记住这个新生成的API Key。

安装 Hexo Algolia

Index 创建完成后,此时这个 Index 里未包含任何数据。 接下来需要安装 Hexo Algolia 扩展, 这个扩展的功能是搜集站点的内容并通过 API 发送给 Algolia。前往站点根目录,执行命令安装:

npm install --save hexo-algolia

更新站点配置

编辑Blog根目录下的 _config.yml ,新增以下配置:

algolia:
applicationID: '填写你的applicationID'
apiKey: '填写刚刚生成的apiKey'
indexName: '填写你的indexName'
chunkSize: 5000

更新Index

当配置完成,在站点根目录下执行:

# Windows将export改为set
export HEXO_ALGOLIA_INDEXING_KEY=`填写刚刚生成的apiKey`
# 如果是局部安装则实用npx hexo algolia
hexo algolia

如果更新成功则将显示如下信息:

# npx hexo algolia
INFO [hexo-algolia] Testing HEXO_ALGOLIA_INDEXING_KEY permissions.
INFO Start processing
INFO [hexo-algolia] 41 records to index (post, page).
INFO [hexo-algolia] Indexing chunk 1 of 1 (41 records)
INFO [hexo-algolia] Indexing done.

如果显示Please provide an Algolia index name in your hexo _config.yml flle,则是Algolia Search API Key indexName 错了,看下之前新建index的名字。

如果显示Not enough rights to update an object near,则是没有修改API Key对应的搜索ACL(访问控制列表),请按照获取API Key小节中的程序走走看。

集成至NexT主题中

更改主题目录下配置文件 _config.yml ,找到 Algolia Search 配置部分,将 enable 改为 true 即可,根据需要你可以调整 labels 中的文本。

# Algolia Search
algolia_search:
enable: false
hits:
per_page: 10
labels:
input_placeholder: Search for Posts
hits_empty: "We didn't find any results for the search: ${query}"
hits_stats: "${hits} results found in ${time} ms"