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全文搜索、整理和不间断空格的主要内容,如果未能解决你的问题,请参考以下文章

全文本搜索

mysql 必知必会整理—组合查询与全文搜索[九]

MySql5.7InnoDB全文索引(针对中文搜索)

全文搜索之MySQL与ElasticSearch搜索引擎

实现全文检索-基于MySQL

牛B,用MySQL实现搜索引擎