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

nxowjjhe  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(282)

我使用以下查询创建了一个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

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

14ifxucb

14ifxucb1#

这不是问题。全文搜索根据给定的列匹配单词,因为第一行与添加到结果列表或数组中的单词匹配。你的数据是这样存储的吗
id |名称

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

然后返回的第一行是acer liquid z6。
此外,您可以发挥最小字长,以达到您的满意。但是,我看不出有什么问题。您可以始终使用后端代码筛选列表。

cqoc49vn

cqoc49vn2#

当mysql构建全文索引时,它不会索引所有单词。有多个不同的参数——什么定义了单词边界,单词中允许哪些字符。最重要的两件事:
最小字长
停止词列表
最小字长为3或4,具体取决于存储引擎。无论哪种情况, 'z6' 将被忽略。文档是理解这些参数的好地方。
您需要将参数设置为适当的值并重建索引。

相关问题