我使用以下查询创建了一个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
因此全文索引不会首先返回最相关的结果。是否有更可靠的方法来搜索索引或强制匹配首先返回最相关的结果?
答案 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。
此外,您可以使用最小字长来达到您的满意度。但是,我没有看到问题所在。您始终可以使用后端代码过滤列表。