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

标签 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

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

最佳答案

MySQL在建立全文索引时,并不会索引所有的词。有多个不同的参数——什么定义了单词边界,单词中允许使用哪些字符。还有两个最重要的:

  • 最小字长
  • 停用词列表

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

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

关于MYSQL 全文匹配不返回预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50115644/

相关文章:

c# - 在 Mysql insert 语句中使用变量

mysql - 我的SQL语句错了吗?

php - 复制 AR 记录并将其重新插入数据库

c++ - 在 Objective-C 中调用 sqlite3 数据库时如何调用和转换 int/NSNumber?

javascript - 将对象从模板传递到 django View ( Controller )

php - 如何使用php+mysql在两个数据库之间复制表?

mysql - 这个 SQL 查询有什么问题

mysql - 如何在字符串mysql之间插入单词

html - 如何一次插入插入两个序列号

mysql - 根据当前表中的相同数据向表中插入数据