我使用以下查询创建了一个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条答案
按热度按时间14ifxucb1#
这不是问题。全文搜索根据给定的列匹配单词,因为第一行与添加到结果列表或数组中的单词匹配。你的数据是这样存储的吗
id |名称
然后返回的第一行是acer liquid z6。
此外,您可以发挥最小字长,以达到您的满意。但是,我看不出有什么问题。您可以始终使用后端代码筛选列表。
cqoc49vn2#
当mysql构建全文索引时,它不会索引所有单词。有多个不同的参数——什么定义了单词边界,单词中允许哪些字符。最重要的两件事:
最小字长
停止词列表
最小字长为3或4,具体取决于存储引擎。无论哪种情况,
'z6'
将被忽略。文档是理解这些参数的好地方。您需要将参数设置为适当的值并重建索引。