MySQL全文搜索、整理和不间断空格
Posted
技术标签:
【中文标题】MySQL全文搜索、整理和不间断空格【英文标题】:MySQL fulltext search, collation and non-breaking space 【发布时间】:2015-03-02 17:06:20 【问题描述】:我将 UTF-8 编码数据放入配置为使用 utf8 字符集的数据库表中,但是当我随后进行全文搜索时,它与不间断空格之前的单词不匹配。
例如,对于格式问题,我们在乙型肝炎中有一个不可换行的空格。搜索肝炎时,此字符串不匹配。
CREATE TABLE `search` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` text COLLATE FULLTEXT KEY `title` (`title`),
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`),
) ENGINE=MyISAM AUTO_INCREMENT=202337 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
此查询不返回任何内容:
SELECT
title,
MATCH(title) AGAINST ('hepatitis') AS `titleScore`
FROM
`search`
WHERE
MATCH(title) AGAINST ("hepatitis")
ORDER BY
`titleScore` DESC LIMIT 10;
但此查询返回以下内容:
SELECT
title
FROM
search
WHERE
title LIKE "%hepatitis%";
+-------------------------------------------------------------------------+
| title |
+-------------------------------------------------------------------------+
| Comparison of drugs for chronic HBeAg-positive hepatitis B |
| Antivirals in chronic hepatitis C |
| Chronic hepatitis C |
| Antivirals for hepatitis C |
| Antivirals for hepatitis B |
| Other antivirals for hepatitis C |
| Chronic hepatitis B |
| Hepatitis A vaccine |
| Hepatitis B vaccine |
| Hepatitis B immunoglobulin |
| Hepatitis C virus protease inhibitors, see HCV-protease inhibitors |
+-------------------------------------------------------------------------+
根据http://ftp.nchu.edu.tw/mysql/tech-resources/articles/full-text-revealed.html#breaking 处的“我们未放入手册中的全文内容”,全文应仅将字母数字匹配为单词元素,因此在不间断空格处中断(尽管它没有' t 明确声明不间断空格字符本身)。
我确实在 MySQL 手册上找到了评论 - http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html
要使 FULLTEXT MATCH 与日文 UTF-8 文本一起使用,请注意 日文文本中的单词由 ASCII 空格分隔 字符,而不是日语 UTF-8(或其他)间距字符。 (什么时候 使用 phpMyAdmin 管理数据/编写 SQL 查询,必须切换 远离您的日语输入法以插入空格字符...)
我创建了一个新的排序规则,following the MySQL manual,具有以下规则:
<charset name="utf8">
...
<collation name="utf8_custom" id="1001">
<rules>
<reset>\u0020</reset> <!-- ascii space character -->
<i>\u00A0</i> <!-- non-breaking space -->
<reset>A</reset> <!-- test -->
<i>B</i>
</rules>
</collation>
</charset>
我重新启动了服务器,然后通过show collation like 'utf8_custom';
确认排序规则可用
然后我更改了表以使用新的排序规则,并使用修复表重建索引以获得良好的度量。
SELECT title FROM search WHERE "Hepatitis A vaccine";
仍然没有返回结果
SELECT title FROM search WHERE "Hepatitis A vaccine";
确实返回结果 - 实际上是两个:
+------------------------+
| title |
+------------------------+
| Hepatitis A vaccine |
| Hepatitis B vaccine |
+------------------------+
这表明排序规则中使 B 与 A 相同的规则正在被遵守,但不间断空格未被遵守。
Â
困扰着我——我的表是 utf8,我的客户是 utf8,源数据是 utf8。我不确定我应该看到这个角色。
【问题讨论】:
MySQL Full-Text search for hashtags (including the # symbol in index) 的可能重复项(另一个问题询问如何将单词分隔符视为常规字符,这与您的问题完全相反)。 很好,谢谢 - 我认为创建一个新的排序规则可能是我们要走的路,但由于截止日期迫在眉睫,我刚刚从搜索语料库中过滤了非 ascii 字符 【参考方案1】:问题在于将搜索数据写入数据库的步骤 - 我必须发出 SET NAMES "utf8"
(或 Zend/PDO 等效项)以确保发送到 utf8 表的 utf8 字符串已传输作为 utf8。
在我的 Zend application.ini 中为 charset = 'utf8'
添加一个参数到我的数据库配置解决了这个问题。
【讨论】:
以上是关于MySQL全文搜索、整理和不间断空格的主要内容,如果未能解决你的问题,请参考以下文章