【问题标题】:How to make MediaWiki search ignore accents?如何让 MediaWiki 搜索忽略重音符号?
【发布时间】:2019-01-13 18:44:50
【问题描述】:

我正在运行一个 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搜索功能不是很强大;您可能想要安装搜索扩展程序,例如CirrusSearch.
  • 我希望我可以利用 MySQL 对排序规则的出色支持(至少在最近的版本中),而不必安装 2 个 MediaWiki 扩展 + 1 个第三方软件。但恐怕你是对的:MediaWiki 方面似乎没有努力支持这一点,而且我不确定我是否想修改代码并经历未来升级的维护地狱。
  • @Benjamin My MediaWiki 1.31 安装默认工作。我有一篇文章叫René,可以通过搜索Rene找到。您不能这样做的唯一原因是否可能是因为自创建您的文章的 MediaWiki 版本以来索引它们的方法发生了变化?您是否尝试过创建新文章并查看是否有问题?
  • @Benjamin 我认为stackoverflow.com/questions/16014167/… 的所有内容都不适合您?

标签: mediawiki


【解决方案1】:

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

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

每当更新 MediaWiki 安装时,都必须应用类似的程序,这会增加维护成本。手续简单,这是我现在愿意接受的费用。

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

【讨论】:

    【解决方案2】:

    如果你不想要CirrusSearch,你可以尝试一个轻量级的扩展: TitleKey

    安装

    • Download 并将文件放在您的 extensions/ 文件夹中名为 TitleKey 的目录中。
    • LocalSettings.php的底部添加以下代码:

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

    • 运行rebuildTitleKeys.php 脚​​本(这需要命令行访问):

      php extensions/TitleKey/rebuildTitleKeys.php
      
    • 完成 - 在您的 wiki 上导航至 Special:Version 以验证扩展是否已成功安装。

    【讨论】:

    • 我按照这里的每一步,安装顺利,更新和重建脚本OK,Special:Version页面显示TitleKey扩展已安装,但不幸的是搜索仍然区分大小写:搜索@987654330 @ 返回结果,而 aromatherapie 不返回。有什么建议吗?
    • 对不起。我以为扩展会解决您的问题,但这似乎只是一个功能请求:phabricator.wikimedia.org/T22097
    【解决方案3】:

    让我们一次解决一个问题。

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

    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 的上下文中编写的,如果您使用其他数据库管理,查询可能会略有不同,但思路保持不变。

    这应该可以完成工作。如果有任何问题,请随时添加 cmets。

    【讨论】:

    • 嗨,欢迎来到 Stack Overflow。如果我自己编写代码,我知道如何处理不区分大小写的搜索(顺便说一句,最好使用collations 处理);我的问题是,出于上述原因,如何让 MediaWiki 以不区分大小写的方式处理搜索,我自己不摆弄代码。因此,恐怕您的回答超出了范围!
    • @Benjamin Ah 有道理,抱歉帮不上忙。
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多