开源全文搜索引擎MeiliSearch

单独安装 MeiliSearch 似乎并没有什么实际的用途,本文只是记录了老苏一次失败的探索。想法应该是没问题的,奈何实力不够啊。

前言

老苏博客上的搜索变得越来越慢,慢的原因应该主要是 2 个:一个是 search.json 的加载速度,一个是全文检索的速度。前者可以通过 CDN 或者其他方式来解决,后者老苏想将 hexo-generator-searchdb 生成的搜索索引文件放到一个 真正的 全文搜索引擎中,而不是继续使用 Local Search

其实目前慢的主要原因应该还是前者;

找来找去找到了 MeiliSearch ,这是一个建立在 LMDB键值 存储之上的全文搜索引擎。与 Elasticsearch 类似,但 MeiliSearch 可能更适合中等规模的数据集(即少于 500 万行)和较小的应用程序。MeiliSearch 提供快速、相关且可容忍错字的搜索,几乎不需要设置时间,对于任何需要专注于最终用户的强大且易于访问的搜索引擎的开发人员来说,它都是一个很好的解决方案。

老苏想研究一下技术可行性,但是搜索了一下并没有找到现成的方案,第一步打算先安装一个 MeiliSearch,亲自感受下具体的功能,如果没问题的话再来研究下一步

什么是 MeiliSearch ?

MeiliSearch 是一个基于 Rust 语言开发的强大、快速、开源、易于使用和部署的搜索引擎。搜索和索引都是高度可定制的。提供开箱即用的功能,例如错字容忍、过滤器和同义词,支持中文。

什么是 LMDB ?

LMDB 数据库和常用的 SQLiteMySQL 等关系型数据库不同, 它是一种非关系型数据库,以键值对的方式进行存储(更像是字典),其中 “键”“值” 的类型都是字符串类型。

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 meilisearch ,选择第一个 getmeili/meilisearch,版本选择 latest

docker 文件夹中,创建一个新文件夹,并将其命名为 meilisearch

文件夹 装载路径 说明
docker/meilisearch /data.ms 存放数据

端口

端口不冲突就行,不确定的话可以用命令查一下

1
2
# 查看端口占用
netstat -tunlp | grep 端口号
本地端口 容器端口
7700 7700

环境

环境变量是可选的,默认是 developer 模式,可以不设置 master key ,只有在指定为 product 模式才必须设置的

可变
MEILI_MASTER_KEY master key

MeiliSearch 的每个实例都有三个键:masterprivatepublic。每个密钥在 API 路由上都有一组给定的权限。每当您设置或更改 master key 时,都会自动生成 private keypublic key

  • master key 可以用来存取所有的路由
  • private key 可以用来存取除了 /keys (用来获取 master keyprivate key )的所有路由。
  • public key 只能用来进行搜索操作。

老苏生成 master key 的方式是在 Bitwarden 中用密码生成器

运行

在浏览器中输入 http://群晖IP:7700 就能看到主界面

由于生产环境需要 API-key 进行搜索,因此 Web 界面仅在开发模式下可用。

日志中

官方示例

1
2
3
4
# 获取private key和public key
curl \
-H "X-Meili-API-Key: 27bb9198372f81f8b95fb75d0252912de061fb6fa90d0ad6eb347cc051f0abe3" \
-X GET 'http://192.168.0.197:7700/keys'

官方提供了一个电影数据库 movie.json ,文件下载地址:https://docs.meilisearch.com/movies.json

将文件上传到群晖的 meilisearch 目录

1
2
3
4
5
6
7
8
9
10
# 进入到 movie.json 所在的目录
cd /volume2/docker/meilisearch

# 用命令行下载文件,已经下了可以跳过
curl -L 'https://docs.meilisearch.com/movies.json' -o movies.json

# 添加文档到 movies 索引
curl -i -X POST 'http://192.168.0.197:7700/indexes/movies/documents' \
--header 'content-type: application/json' \
--data-binary @movies.json

回到 web 界面,刷新一下

官网的动图能清晰的显示如何使用

search.json

默认情况下 hexo-generator-searchdb 生成的搜索索引文件是 search.xml,但其本身支持 XMLJSON 格式输出,所以只要改一下配置即可,search.json 位于博客的根目录下,需将其上传到群晖的 meilisearch 目录,然后执行下面的命令

1
2
3
4
# 添加文档到 movies 索引
curl -i -X POST 'http://192.168.0.197:7700/indexes/search/documents' \
--header 'content-type: application/json' \
--data-binary @search.json

但是并没有像官方示例一样,老苏尝试过增加 primaryKey,但始终没有结果,可能是格式不对吧,一时半会儿也没研究明白,先这样吧,等有精力了再说

本来还想着是不是在 vercel 上搭个搜索服务,这下都省了

小结

目前情况下,博客上点 搜索 后弹出的搜索界面,如果是一直转圈,最好是等一会儿,或者重新再刷新一下页面

如果直接显示 放大镜,也就是下面👇这样

那就可以直接输入关键词进行搜索,基本上是秒开

所以再一次证实了慢的原因是加载 search.json 慢,而不是搜索本身慢,因此 MeiliSearch 的研究也就不急在一时。

参考文档

meilisearch/MeiliSearch: Powerful, fast, and an easy to use search engine
地址:https://github.com/meilisearch/MeiliSearch

MeiliSearch
地址:https://www.meilisearch.com/

MeiliSearch Documentation | MeiliSearch Documentation v0.24
地址:https://docs.meilisearch.com/

MeiliSearch vs Elasticsearch
地址:https://blog.meilisearch.com/why-should-you-use-meilisearch-over-elasticsearch/

We Built A Search Engine With MeiliSearch and JavaScript: Here’s How You Can Too | Hacker Noon
地址:https://hackernoon.com/we-built-a-search-engine-with-meilisearch-and-javascript-heres-how-you-can-too-zz2d3zae

meilisearch/docs-searchbar.js: Front-end search bar for documentation with MeiliSearch
地址:https://github.com/meilisearch/docs-searchbar.js/

90pixel/MeiliAdmin: Open Source MeiliSearch Management Tool
地址:https://github.com/90pixel/MeiliAdmin

PHP使用MeiliSearch实现全文检索_织梦猫的博客-CSDN博客_meilisearch文档
地址:https://blog.csdn.net/jason19905/article/details/115055666

使用MeiliSearch实现Hugo博客搜索 - Jefferywang的烂笔头
地址:https://blog.wangjunfeng.com/post/hugo-meilisearch/