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