关于Flarum中无法使用中文搜索功能
前言
在搭建 Flarum 论坛后,发现一个很问题就是:中文搜索功能似乎不支持模糊查询。
例如一篇文章的标题是:关于迷茫的一些话题
你在搜索框输入 关于、 迷茫、 一些话题 等关键词 是无法得到搜索结果的
但是你输入:关于迷茫的一些话题 他就能准确的返回结果
本次问题出现在以下环境中:
Flarum core: 1.8.10
DataBase:11.8.6-MariaDB-ubu2404
PHP version: 8.3.22
问题根源:Flarum 默认使用 MySQL/MariaDB 的全文索引分词器是基于空格和标点进行分词的。
MariaDB/MySQL 默认的全文索引分词器(ngram 或 MeCab 之前)是基于空格和标点进行分词的。英文单词由空格自然分隔,但中文句子是连续的字符序列(例如:“关于迷茫的一些话题”)。
数据库默认认为这是一个无空格的长单词。
因此,它建立的全文索引条目仅为
关于迷茫的一些话题这个完整的字符串。数据库默认的分词器在寻找空格。因为中文句子没有空格,它无法拆分词汇,导致索引表里只存了那句完整的长难句(doge)
例如:
英文视角:
"I love Linux"是由空格自然切分的词组。数据库索引会记录I,love,Linux三个单词。
中文视角:关于迷茫的一些话题 在数据库眼里是一个整体。
所以你搜索 关于、 迷茫、 一些话题 等关键词 是无法得到搜索结果的;你输入:关于迷茫的一些话题 他就能准确的返回结果
解决方案
方案一:修改数据库全文索引分词器为 Ngram
注意!此办法仅支持MySQL5.7+ 或 MySQL8+ 的版本,如果你使用了 MariaDB 作为数据库,请查看方案二 或者 自行查看发行说明,我不清楚MariaDB 是否支持Ngram!
并且此方法一定程度上会影响数据库性能!
通过修改数据库索引定义,让 MySQL 以固定长度切分汉字(例如每 2 个汉字一个词),从而支持模糊搜索。
操作步骤:
备份数据库 (涉及危险操作,可能会导致数据丢失)
配置
ngram_token_size:对
ngram_token_size进行设置。打开MySQL配置文件mysql.cnf,加入如下内容[mysqld] ngram_token_size=2.重启数据库
修改表结构,重建索引:
-- 这两组代码要在 Flarum 数据库下执行 以重建全文索引。 记得改自己的表前缀
-- 1. 删除原有的全文索引
ALTER TABLE `flarum_posts` DROP INDEX `content`;
ALTER TABLE `flarum_discussions` DROP INDEX `title`;
-- 2. 创建支持 ngram 解析器的全文索引
ALTER TABLE `flarum_posts` ADD FULLTEXT INDEX `content` (`content`) WITH PARSER ngram;
ALTER TABLE `flarum_discussions` ADD FULLTEXT INDEX `title` (`title`) WITH PARSER ngram;清理 Flarum 缓存:
php flarum cache:clear效果预期:重新搜索“迷茫”、“关于”、“话题”均可返回结果。实现模糊查询
方案二:使用搜索引擎 我这里以Meilisearch为例子
操作步骤:
部署Meilisearch 建议使用Doceker部署 (这里不讲解Meilisearch的部署方式 具体请见下方链接文档 )
使用 Docker 运行 Meilisearch - Meilisearch 文档 -
安装 Scout Search 扩展
composer require clarkwinkelmann/flarum-ext-scoutScout Search - Flarum Community 他不仅支持Meilisearch ,具体请详见文档
开启扩展:在 Flarum 后台开启
Scout SearchScoutSearch 插件设置:
驱动: 选择
Meilisearch。
Meilisearch 设置
Host:
http://你部署Meilisearch服务器地址:端口Master Key: 填入你刚才创建容器时设置的密钥。

配置好了不代表能搜到,因为 Meilisearch 里现在是空的。你需要把 MariaDB 里的用户产生的帖子灌进搜索引擎。
php flarum scout:import-all
执行完毕后没有异常你就再回去搜索试试吧!