「日志记录」Flarum借助Sonic开启中文搜索插图

Flarum本身的索引对中文不太友好,所以选择使用Sonic进行分词创建索引。当然Flarum也是支持的,并且有相关的拓展。本篇文章记录如何借助SonicFlarum开启中文搜索。

「日志记录」Flarum借助Sonic开启中文搜索插图1

关于Sonic

Sonic是一个用Rust编写的开源搜索引擎服务器,专注于提供简单、高性能和轻量级的搜索解决方案。它接收用户的查询请求并返回与查询匹配的标识符,这些标识符指向实际文档,但Sonic本身不存储这些文档数据。相反,应用程序需要从其他数据库(如MongoDB、MySQL等)中检索实际的文档数据,因为搜索结果仅包含标识符。这种设计使得整个系统在存储方面更为简单和高效。 Sonic的应用领域广泛,可以用于检索消息、文章、CRM联系人等不同类型的文档。其轻量级和高性能的特性使其成为处理搜索需求的可靠选择。

部署

这里我们选用Docker来部署Sonic,便于管理项目。

目前最新的宝塔面板已经支持一键安装并启用Docker,如果没有Docker这个菜单选项的,可以在「软件商店」搜索「docker」,选择一个进行可视化安装

环境

  • CentOS Stream 8 x86_64(Py3.7.9) 
  • 宝塔面板

拉取镜像

在镜像名中输入:「valeriansaliou/sonic:v1.4.3」,点击确认即可拉取镜像。

配置文件

由于是在容器中运行,所以我们需要在本机目录编写一个配置文件,然后映射到容器中中,并且将存储目录也映射过去。

例如,我这里在「/home/sonic」这个目录下创建了config.cfg文件,以下是该文件的模板:

[server]

log_level = "error"

[channel]

inet = "0.0.0.0:1491"
tcp_timeout = 30

auth_password = "你的自定义密码"

[channel.search]

query_limit_default = 10
query_limit_maximum = 100
query_alternates_try = 4

suggest_limit_default = 5
suggest_limit_maximum = 20

[store]

[store.kv]

path = "/var/lib/sonic/store/kv/"

retain_word_objects = 1000

[store.kv.pool]

inactive_after = 1800

[store.kv.database]

flush_after = 900

compress = true
parallelism = 2
max_files = 100
max_compactions = 1
max_flushes = 1
write_buffer = 16384
write_ahead_log = true

[store.fst]

path = "/var/lib/sonic/store/fst/"

[store.fst.pool]

inactive_after = 300

[store.fst.graph]

consolidate_after = 180

max_size = 2048
max_words = 250000

这里我们选择监听「1491」端口,所以在创建容器时,也要将1491端口穿透出去。

编写好config.cfg文件后,我们在同目录下创建一个「store」目录,以下是我们需要创建的文件和目录

添加并启动容器

「日志记录」Flarum借助Sonic开启中文搜索插图4

如上图所示,分别配置一下端口和挂载目录就行,如果要填写启动命令的也行,但是其他的选项就不要动

添加后容器就会自动运行,如果没有错的话,你应该会看到容器已经进入已启动的状态,如下图所示:

「日志记录」Flarum借助Sonic开启中文搜索插图5

如果并没有「已启动」,检查一下容器的日志,看看是哪里存在问题。

安装第三方插件

配置完以上后,我们来安装对应的拓展插件,进入网站目录,执行以下命令:

composer require ganuonglachanh/sonic

安装完后,我们来到插件设置,配置一下密码就行:

「日志记录」Flarum借助Sonic开启中文搜索插图6

这里的密码就是你在创建config.cfg文件时所填写的密码,主要不要填写错了。

创建索引

完成以上步骤后,最后执行以下命令创建索引,重新使用论坛搜索即可搜索到中文

php flarum sonic:addtoindex
「日志记录」Flarum借助Sonic开启中文搜索插图7

完事儿,不用再去折腾什么数据啥的了。