如何让 MediaWiki 搜索忽略重音?
How to make MediaWiki search ignore accents?
我是 运行 一个 MediaWiki 实例,在撰写本文时我刚刚升级到最新版本 1.32.0。这个 wiki 已有将近 10 年的历史,并且经历了多次升级。
这是一个法语 wiki,让说法语的人恼火的是 内置搜索总是考虑重音字符与非重音字符,之后的版本版本。
例如,搜索 Aromathérapie
returns 多个结果,而搜索 Aromatherapie
returns 0 个结果。
起初我以为这是数据库整理问题,直到我注意到 searchindex
table 实际上填充了 ASCII 编码的 UTF-8 单词。以上面的例子为例,aromathérapie
存储为 aromathu8c3a9rapie
,因此更改 table 排序规则没有帮助。
通过源代码挖掘,我找到了负责此编码的 SearchMySQL::normalizeText() 方法。
据我所知,此方法在编码之前所做的唯一规范化是小写:
MediaWikiServices::getInstance()->getContentLanguage()->lc( $out )
目前看来,似乎没有办法让内置搜索忽略重音符号。
我在谷歌上搜索了很多解决方案,发现大多是旧的、不相关的线程。我真的很惊讶没有找到更多关于这个主题的文献。
如何使 MediaWiki 搜索不区分大小写和重音?
如果你不想CirrusSearch,你可以尝试一个轻量级的扩展:
TitleKey
安装
- Download 并将文件放在 extensions/ 文件夹中名为 TitleKey 的目录中。
在 LocalSettings.php
的底部添加以下代码:
wfLoadExtension( 'TitleKey' );
运行 更新脚本将自动创建此扩展所需的必要数据库表。
运行 rebuildTitleKeys.php
脚本(这需要命令行访问):
php extensions/TitleKey/rebuildTitleKeys.php
完成 – 导航到您的 wiki 上的 Special:Version
以验证扩展是否已成功安装。
让我们一次解决一个问题。
首先让我们处理较小的问题,区分大小写
select * from tableName where lower(col_name) = lower(searchTerm);
或
select * from tableName where upper(col_name) = upper(searchTerm);
第 2 部分处理编码,按照其他人的建议,您可以下载更强大的搜索工具,或者您可以更改搜索词的表示方式,convert
searchTerm
到 %s%e%a%r%c%h%T%e%r%m%
。这将基本上添加能够忽略由 UTF-8 编码添加的额外字符的通配符。这种方法的优点是您只需对现有代码进行最少的更改,但会略微增加计算量和复杂性。
这是在 SQL 的上下文中编写的,如果您使用其他数据库管理,查询可能会略有不同,但思路保持不变。
这应该可以完成工作。如果有任何问题,请随时添加评论。
我对此并不感到自豪,但这是我解决它的方法,使用 MySQL 对归类的内置支持( 可以处理全文索引——至少在 MySQL 的最新版本中——与代码所说的相反):
- 将
searchindex
table 转换为 utf8mb4
:
ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 已将 this patch 应用于 SearchMySQL.php:
- 没有小写,没有用十六进制编码的对应字符替换 UTF-8 字符
- unicode
u
标志 preg_replace()
- 重建
searchindex
table:
php maintenance/rebuildtextindex.php
每当更新 MediaWiki 安装时都必须应用类似的过程,这会增加维护成本。手续简单,是我现在愿意接受的费用。
最后要注意的是,这不会使自动完成工作不区分大小写,只有搜索结果。这对我来说已经足够了。
我是 运行 一个 MediaWiki 实例,在撰写本文时我刚刚升级到最新版本 1.32.0。这个 wiki 已有将近 10 年的历史,并且经历了多次升级。
这是一个法语 wiki,让说法语的人恼火的是 内置搜索总是考虑重音字符与非重音字符,之后的版本版本。
例如,搜索 Aromathérapie
returns 多个结果,而搜索 Aromatherapie
returns 0 个结果。
起初我以为这是数据库整理问题,直到我注意到 searchindex
table 实际上填充了 ASCII 编码的 UTF-8 单词。以上面的例子为例,aromathérapie
存储为 aromathu8c3a9rapie
,因此更改 table 排序规则没有帮助。
通过源代码挖掘,我找到了负责此编码的 SearchMySQL::normalizeText() 方法。
据我所知,此方法在编码之前所做的唯一规范化是小写:
MediaWikiServices::getInstance()->getContentLanguage()->lc( $out )
目前看来,似乎没有办法让内置搜索忽略重音符号。
我在谷歌上搜索了很多解决方案,发现大多是旧的、不相关的线程。我真的很惊讶没有找到更多关于这个主题的文献。
如何使 MediaWiki 搜索不区分大小写和重音?
如果你不想CirrusSearch,你可以尝试一个轻量级的扩展: TitleKey
安装
- Download 并将文件放在 extensions/ 文件夹中名为 TitleKey 的目录中。
在
LocalSettings.php
的底部添加以下代码:wfLoadExtension( 'TitleKey' );
运行 更新脚本将自动创建此扩展所需的必要数据库表。
运行
rebuildTitleKeys.php
脚本(这需要命令行访问):php extensions/TitleKey/rebuildTitleKeys.php
完成 – 导航到您的 wiki 上的
Special:Version
以验证扩展是否已成功安装。
让我们一次解决一个问题。
首先让我们处理较小的问题,区分大小写
select * from tableName where lower(col_name) = lower(searchTerm);
或
select * from tableName where upper(col_name) = upper(searchTerm);
第 2 部分处理编码,按照其他人的建议,您可以下载更强大的搜索工具,或者您可以更改搜索词的表示方式,convert
searchTerm
到 %s%e%a%r%c%h%T%e%r%m%
。这将基本上添加能够忽略由 UTF-8 编码添加的额外字符的通配符。这种方法的优点是您只需对现有代码进行最少的更改,但会略微增加计算量和复杂性。
这是在 SQL 的上下文中编写的,如果您使用其他数据库管理,查询可能会略有不同,但思路保持不变。
这应该可以完成工作。如果有任何问题,请随时添加评论。
我对此并不感到自豪,但这是我解决它的方法,使用 MySQL 对归类的内置支持( 可以处理全文索引——至少在 MySQL 的最新版本中——与代码所说的相反):
- 将
searchindex
table 转换为utf8mb4
:
ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 已将 this patch 应用于 SearchMySQL.php:
- 没有小写,没有用十六进制编码的对应字符替换 UTF-8 字符
- unicode
u
标志preg_replace()
- 重建
searchindex
table:php maintenance/rebuildtextindex.php
每当更新 MediaWiki 安装时都必须应用类似的过程,这会增加维护成本。手续简单,是我现在愿意接受的费用。
最后要注意的是,这不会使自动完成工作不区分大小写,只有搜索结果。这对我来说已经足够了。