如何让 MediaWiki 搜索忽略重音?

问题描述 投票:0回答:3

我正在运行一个 MediaWiki 实例,在撰写本文时我刚刚将其升级到最新版本 1.32.0。这个wiki已经有近10年的历史了,并且经历了多次升级。

这是一个法语维基,对于讲法语的人来说,令人烦恼的是 内置搜索始终认为重音字符与非重音字符不同,一个又一个版本。

例如,搜索

Aromathérapie
将返回多个结果,而搜索
Aromatherapie
将返回 0 个结果。

我一开始以为这是一个数据库排序问题,直到我注意到

searchindex
表实际上填充了 ASCII 编码的 UTF-8 单词。以上面的示例为例,
aromathérapie
存储为
aromathu8c3a9rapie
,因此更改表排序规则没有帮助。

深入研究源代码,我找到了负责此编码的SearchMySQL::normalizeText()方法。

据我所知,此方法在编码之前所做的唯一标准化是小写:

MediaWikiServices::getInstance()->getContentLanguage()->lc( $out )

就目前情况而言,似乎没有办法让内置搜索忽略重音。

我在谷歌上搜索了很多解决方案,发现大部分都是旧的、不相关的线程。我真的很惊讶没有找到更多关于这个主题的文献。

如何使 MediaWiki 搜索不区分大小写和重音?

mediawiki
3个回答
3
投票

我并不为此感到自豪,但这是我如何解决它的,使用 MySQL 内置的排序规则支持(它适用于全文索引——至少在最新版本的 MySQL 中——与代码所说的相反):

  • searchindex
    表转换为
    utf8mb4

    ALTER TABLE searchindex CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 将此补丁应用到includes/search/SearchMySQL.php
      没有小写,没有用十六进制编码的对应字符替换 UTF-8 字符
    • u
    •  中的 
      unicode
      preg_replace()
      标志
  • 重建
  • searchindex
    表:
    
    php maintenance/rebuildtextindex.php
    
    
每当更新 MediaWiki 安装时都必须应用类似的过程,这会增加维护成本。手续简单,这是我现在愿意接受的费用。

最后要注意的是,这不会使自动完成工作不区分大小写,而只会使搜索结果不区分大小写。目前这对我来说已经足够了。


0
投票
如果你不想要

CirrusSearch,你可以尝试一个轻量级扩展: 标题键

安装

  • 下载并将文件放在扩展程序/文件夹中名为 TitleKey 的目录中。
  • 在您的

    LocalSettings.php

    底部添加以下代码:

    wfLoadExtension( 'TitleKey' );
    
    
  • 运行更新脚本,该脚本将自动创建此扩展所需的必要数据库表。

  • 运行

    rebuildTitleKeys.php

    脚本(这需要命令行访问):

    php extensions/TitleKey/rebuildTitleKeys.php
    
    
  • 完成 – 导航至 wiki 上的

    Special:Version

     以验证扩展是否已成功安装。


-1
投票
让我们一次解决一个问题。

首先让我们处理较小的问题,区分大小写

select * from tableName where lower(col_name) = lower(searchTerm);



select * from tableName where upper(col_name) = upper(searchTerm);



第2部分处理编码,按照其他人的建议,您可以下载更强大的搜索工具,或者您可以更改搜索词的表示方式,转换

searchTerm

%s%e%a%r%c%h%T%e%r%m%
。这基本上会添加能够忽略 UTF-8 编码添加的额外字符的通配符。这种方法的优点是您必须对现有代码进行最少的更改,但它会稍微增加计算量和复杂性。

这是在 SQL 上下文中编写的,如果您使用其他数据库管理,查询可能会略有不同,但想法保持不变。

这样就可以完成工作了。如果有任何问题请随时添加评论。

© www.soinside.com 2019 - 2024. All rights reserved.