MYSQL全文匹配未返回预期结果

时间:2018-05-01 11:24:39

标签: mysql sql database database-design

我使用以下查询创建了一个MYSQL表:

CREATE TABLE IF NOT EXISTS `test` (
   `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
   `name` VARCHAR(255) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY (`name`),
    FULLTEXT INDEX(`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

并拥有以下行:

   id | name
   ----------
    1 | Acer Liquid Z6 Plus
    2 | Acer Liquid Z6
    3 | Acer Liquid X2

我想使用MATCH查询来搜索Acer Liquid Z6,因此我运行了以下查询:

SELECT * FROM `test` WHERE MATCH(name) AGAINST('acer liquid z6' IN NATURAL LANGUAGE MODE)

由于某种原因,查询返回Acer Liquid Z6 Plus作为第一个结果:

   id | name
   ----------
    1 | Acer Liquid Z6 Plus
    2 | Acer Liquid Z6
    3 | Acer Liquid X2

因此全文索引不会首先返回最相关的结果。是否有更可靠的方法来搜索索引或强制匹配首先返回最相关的结果?

2 个答案:

答案 0 :(得分:1)

当MySQL构建全文索引时,它不会索引所有单词。有多个不同的参数 - 定义单词边界的内容,单词中允许的字符。最重要的两个:

  • 最短字长
  • 停止词汇列表

最小字长为3或4,具体取决于存储引擎。在任何一种情况下,都会忽略'z6'documentation是了解这些参数的好地方。

您需要将参数设置为适当的值并重建索引。

答案 1 :(得分:1)

这不是问题。全文搜索会根据您给出的列匹配单词,因为第一行与添加到结果列表或数组中的单词匹配。你的数据存储如下

id |名称

1 | Acer Liquid Z6
2 | Acer Liquid Z6 Plus
3 | Acer Liquid X2

然后返回的第一行将是Acer Liquid Z6。

此外,您可以使用最小字长来达到您的满意度。但是,我没有看到问题所在。您始终可以使用后端代码过滤列表。