gpt4 book ai didi

mysql - 如何在 MediaWiki 数据库中进行重音和不区分大小写的搜索?

转载 作者:可可西里 更新时间:2023-11-01 07:03:37 24 4
gpt4 key购买 nike

假设我的 wiki (MediaWiki 1.19.4) 中有这些页面标题:

SOMETHIng
Sómethìng
SomêthÏng
SÒmetHínG

如果用户搜索something,我希望所有 4 个页面都作为结果返回。

目前我唯一能想到的就是这个查询(MySQL Percona 5.5.30-30.2):

SELECT page_title
FROM page
WHERE page_title LIKE '%something%' COLLATE utf8_general_ci

它只返回 SOMETHIng

我必须走在正确的道路上,因为如果我搜索sóméthíngSÓMÉTHÍNG,我会得到SOMETHIng 作为结果。我如何修改查询才能获得预期的其他结果?性能在这里并不重要,因为 page 表仅包含约 2K 行。

这是带有相关位的表定义:

CREATE TABLE page (
(...)
page_title VARCHAR(255) NOT NULL DEFAULT '' COLLATE latin1_bin,
(...)
UNIQUE INDEX name_title (page_namespace, page_title),
)

表格定义不得修改,因为这是 MediaWiki 和 AFAIK 的库存安装,其代码期望以这种方式定义该字段(即 unicode 存储为二进制数据)。

最佳答案

MediaWiki TitleKey extension基本上是为此而设计的,但它只做案例折叠。但是,如果您不介意对其进行一些修改,并且拥有 PHP iconv extension安装后,您可以编辑 TitleKey_body.php并替换方法:

static function normalize( $text ) {
global $wgContLang;
return $wgContLang->caseFold( $text );
}

例如:

static function normalize( $text ) {
return strtoupper( iconv( 'UTF-8', 'US-ASCII//TRANSLIT', $text ) );
}

并(重新)运行 rebuildTitleKeys.php。

TitleKey 扩展将其规范化的标题存储在 separate table 中,令人惊讶地命名为 titlekey。它旨在通过 MediaWiki 搜索界面访问,但如果您愿意,您当然也可以直接查询它,例如像这样:

SELECT page.* FROM page
JOIN titlekey ON tk_page = page_id
WHERE tk_namespace = 0 AND tk_key = 'SOMETHING';

关于mysql - 如何在 MediaWiki 数据库中进行重音和不区分大小写的搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16014167/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com