我正在运行一个MediaWiki实例,在撰写本文时,该实例刚刚升级到了最新版本1.32.0。该Wiki已有近10年的历史,并且已经进行了许多升级。
这是一个法语维基,对于讲法语的人来说,令人讨厌的是,内置搜索一直在考虑不同版本的重音字符与非重音字符的区别。
例如,搜索Aromathérapie
返回许多结果,而搜索Aromatherapie
返回0结果。
我最初以为这是数据库整理问题,直到我注意到searchindex
表实际上是用ASCII编码的UTF-8单词填充的。以上面的示例为例,aromathérapie
被存储为aromathu8c3a9rapie
,因此更改表排序规则无济于事。
翻阅源代码,我发现负责此编码的SearchMySQL::normalizeText()方法。
据我所知,此方法在编码之前所做的唯一标准化是小写:
MediaWikiServices::getInstance()->getContentLanguage()->lc( $out )
就目前而言,似乎没有办法使内置搜索忽略重音符号。
我在Google上搜索了很多解决方案,并且发现了大多数不相关的旧线程。没有找到更多关于该主题的文献,我感到非常惊讶。
如何使MediaWiki搜索区分大小写且不区分重音?
答案 0 :(得分:2)
我不为此感到骄傲,但是这是我使用MySQL内置的校对支持(可以与全文索引一起使用的,至少在最新的MySQL版本中与此相反),如何解决了这一问题符合代码所说):
searchindex
表转换为utf8mb4
:ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
u
中的preg_replace()
标志searchindex
表:
php maintenance/rebuildtextindex.php
无论何时更新MediaWiki安装,都将必须执行类似的过程,这增加了维护成本。程序很简单,这是我现在愿意接受的费用。
最后一点是,这不会使自动完成功能不区分大小写,只会使搜索结果不区分大小写。目前对我来说已经足够了。
答案 1 :(得分:0)
如果您不想使用CirrusSearch,则可以尝试使用轻量级扩展程序: TitleKey
安装
在LocalSettings.php
的底部添加以下代码:
wfLoadExtension( 'TitleKey' );
运行更新脚本,该脚本将自动创建此扩展程序所需的必要数据库表。
运行rebuildTitleKeys.php
脚本(这需要命令行访问):
php extensions/TitleKey/rebuildTitleKeys.php
完成-导航至Wiki上的Special:Version
,以验证扩展程序是否已成功安装。
答案 2 :(得分:-1)
让我们一次解决每个问题。
首先让我们处理较小的问题,区分大小写
select * from tableName where lower(col_name) = lower(searchTerm);
或
select * from tableName where upper(col_name) = upper(searchTerm);
根据其他人的建议,处理编码的第二部分,您可以下载功能更强大的搜索工具,也可以更改搜索词的表示方式,转换
searchTerm
至%s%e%a%r%c%h%T%e%r%m%
。基本上,这将添加通配符,这些通配符可以忽略由UTF-8编码添加的额外字符。这种方法的优点是您必须对现有代码进行最少的更改,但这会稍微增加计算量和复杂性。
这是在SQL上下文中编写的,如果您使用的是其他数据库管理,则查询可能会略有不同,但思路仍然相同。
那应该完成工作。如果有任何问题,请随时添加评论。