如何使MediaWiki搜索忽略重音符号?

时间:2019-01-13 18:44:50

标签: mediawiki

我正在运行一个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搜索区分大小写且不区分重音?

3 个答案:

答案 0 :(得分:2)

我不为此感到骄傲,但是这是我使用MySQL内置的校对支持(可以与全文索引一起使用的,至少在最新的MySQL版本中与此相反),如何解决了这一问题符合代码所说):

  • searchindex表转换为utf8mb4
    ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • this patch应用于SearchMySQL.php:
    • 没有小写字母,没有用十六进制编码的对等字符替换UTF-8字符
    • u中的
    • unicode preg_replace()标志
  • 重建了searchindex表: php maintenance/rebuildtextindex.php

无论何时更新MediaWiki安装,都将必须执行类似的过程,这增加了维护成本。程序很简单,这是我现在愿意接受的费用。

最后一点是,这不会使自动完成功能不区分大小写,只会使搜索结果不区分大小写。目前对我来说已经足够了。

答案 1 :(得分:0)

如果您不想使用CirrusSearch,则可以尝试使用轻量级扩展程序: TitleKey

安装

  • Download,然后将文件放在扩展名/文件夹中名为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上下文中编写的,如果您使用的是其他数据库管理,则查询可能会略有不同,但思路仍然相同。

那应该完成工作。如果有任何问题,请随时添加评论。