mediawiki - 如何让 MediaWiki 搜索忽略重音符号?
问题描述
我正在运行一个 MediaWiki 实例,我在撰写本文时刚刚升级到最新版本 1.32.0。这个 wiki 已有近 10 年的历史,并且经历了多次升级。
这是一个法语 wiki,令说法语的人感到恼火的是,内置的搜索总是考虑与非重音字符不同的重音字符,一个又一个版本。
例如,搜索Aromathérapie
返回多个结果,而搜索Aromatherapie
返回 0 个结果。
起初我认为这是一个数据库排序规则问题,直到我注意到该searchindex
表实际上填充了 ASCII 编码的 UTF-8 单词。以上面的示例为例,aromathérapie
存储为aromathu8c3a9rapie
,因此更改表排序规则无济于事。
挖掘源代码,我找到了负责这种编码的SearchMySQL::normalizeText()方法。
据我所知,此方法在编码之前所做的唯一规范化是小写:
MediaWikiServices::getInstance()->getContentLanguage()->lc( $out )
就目前而言,看起来没有办法让内置搜索忽略重音符号。
我在谷歌上搜索了很多解决方案,发现大多是旧的、不相关的线程。我真的很惊讶没有找到更多关于这个主题的文献。
如何使 MediaWiki 搜索不区分大小写和重音?
解决方案
我并不为此感到自豪,但这是我解决它的方法,使用 MySQL 对排序规则的内置支持(它确实适用于全文索引 - 至少在 MySQL 的最新版本中 - 与代码所说的相反):
searchindex
将表格转换为utf8mb4
:
ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 将此补丁应用于SearchMySQL.php:
- 没有小写字母,没有用十六进制编码的对应字符替换 UTF-8 字符
- unicode
u
标志preg_replace()
- 重建
searchindex
表:php maintenance/rebuildtextindex.php
每当更新 MediaWiki 安装时,都必须应用类似的程序,这会增加维护成本。手续很简单,这是我现在愿意接受的费用。
最后一点是,这不会使自动完成不区分大小写,只有搜索结果。这对我来说已经足够好了。
推荐阅读
- nginx - nginx proxy_pass 到动态 url
- sql-server-2008-r2 - MS SQLServer 搜索以查看一个值是否包含在其他值中
- reactjs - Chrome 扩展程序 ID
- swift - 在哪里转换数据,NSViewController 还是 NSArrayController?
- angular - primeng 数据表分页在服务器端分页上丢失了选择
- php - MYSQL 在 PHP 中查询匹配日期框架的记录
- python - 关于django的list_fields在为好友列表制作模型,在关于制作SNS的项目中
- python - 如何将用户输入保存到 config/json 文件以供以后使用?
- c# - 如何将变量从 C# 传递到 VBA(访问)
- c++ - 如何在字符串向量中获取指向字符串数据的指针?