使用 MeiliSearch 实现 Volantis 主题博客搜索「保姆教程」

写在前面

习惯水文的杜老师花了很长时间才下决心写下此文,教程太长没耐心看,看了又不愿意自行搭建,搭建了又遇到了更多的问题……

正文开始前先卖下队友,点击 这里 访问柚子童鞋写的教程。

历史背景

杜老师的博客再水,也将近 300 万字,检索文件 content.json 大小 1.42MB「还是调整后的,原有的超过 4M」

当有小伙伴使用搜索功能时,需完整加载 content.json 文件才可显示搜索结果,不仅影响体验还会产生较大流量。

之后换成了 Algolia 服务,但其最近节点位于香港,大陆访问速度较慢,且有 API 调用数限制。

在百度上疯狂谷歌之后,发现一款可自建的开源搜索引擎,就是 MeiliSearch 了。

杜老师第一时间推给了柚子童鞋,对方回复能搞!

再次感谢柚子童鞋,很快写好了教程并推送调用代码至 Volantis 主题库中。

服务搭建

杜老师是忠实的容器党,能用 Docker 的绝不考虑其它部署方法,以下是官方的部署命令,其中 MASTER_KEY 自定义,版本号 v0.28 可换成 latest

1
2
3
4
5
6
docker run -it --rm \
-p 7700:7700 \
-e MEILI_MASTER_KEY='MASTER_KEY' \
-v $(pwd)/meili_data:/meili_data \
getmeili/meilisearch \
meilisearch --env="development"

如果想用某塔 Docker 管理器部署,配置如图。但墙裂建议使用命令行部署,杜老师尝试用 Docker 管理器部署几次失败,最后定位问题属于玄学:

获取密钥

部署完成后通过 IP:7700,如能看到下图页面说明部署成功:

这页面好看吧,然而没啥卵用!官方建议使用 Postman 调试 MeiliSearch,并提供了调试文件,点击 这里 跳转至 Postman 页面,复制官方调试文件链接 https://docs.meilisearch.com/postman/meilisearch-collection.json 到 Link 标签项,导入即可:

将上文的 MASTER_KEY 填入 Token 框中:

切换至 Variables,将 url 处替换为 MeiliSearch 的域名,indexUID 建议使用 hexo,记得点击右上方 Save:

展开 MeiliSearch 进入 Key Management-Get keys,点击右侧 Send 即可获取 searchKey:

如若长期使用,建议使用生产模式部署,停用上面的实例后,使用下面命令重新部署:

1
2
3
4
5
6
docker run -d --restart=always \
-p 7700:7700 \
-e MEILI_MASTER_KEY='MASTER_KEY' \
-v $(pwd)/meili_data:/meili_data \
getmeili/meilisearch \
meilisearch --env="production" --no-analytics

调试使用

为保证每篇文章拥有一个唯一值,推荐用 hexo-uuid 插件,进入到博客目录后使用如下命令按照:

1
npm install hexo-uuid

安装完后,需要 blog/_config.yml 配置文件为如下内容:

1
2
3
4
5
6
7
8
jsonContent: 
meta: false
pages: false
posts:
title: true
path: true
text: true
uuid: true

使用如下命令完成检索文件推送:

1
2
3
4
curl -X POST 'https://yoursdomain.com/indexes/hexo/documents/?primaryKey=uuid' \
-H "Authorization: Bearer MASTER_KEY" \
-H "Content-Type: application/json" \
--data-binary '@public/content.json'

参考下面代码修改主题配置文件即可:

1
2
3
4
5
6
7
8
search:
enable: true
service: meilisearch # hexo, algolia, meilisearch
meilisearch:
placeholder: 'Search...'
searchKey: 'searchKey'
indexName: 'hexo'
hostUrl: 'https://m.dusays.com'

注意事项

杜老师在推送检索文件时遇到了全量推送问题,表现为搜索时出现大量重复结果,杜老师选择了最简单粗暴的解决方法,上传前调用删除接口清空数据库:

1
curl -X DELETE 'https://m.dusays.com/indexes/hexo' -H "Authorization: Bearer MASTER_KEY"

最后分享下杜老师的 GitHub Actions 配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
name: CI
on:
push:
branches: [ "main" ]
workflow_dispatch:
schedule:
- cron: '30 16 * * *'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
with:
node-version: '16.17'
- name: npm
run: |
npm i -g hexo-cli
npm i
- name: hexo
run: |
hexo g --silent
gulp
curl -X DELETE 'https://m.dusays.com/indexes/hexo' -H "Authorization: Bearer ${{secrets.MEILISEARCH_KEY}}"
curl -X POST 'https://m.dusays.com/indexes/hexo/documents/?primaryKey=uuid' -H "Authorization: Bearer ${{secrets.MEILISEARCH_KEY}}" -H "Content-Type: application/json" --data-binary '@public/content.json'
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
deploy_key: ${{ secrets.ACTIONS_DEPLOY_KEY }}
external_repository: penndu/my-website
publish_branch: master
publish_dir: ./public

本文链接:https://my.lmcjl.com/post/16939.html

展开阅读全文

4 评论

留下您的评论.