我有以下数据库模式,例如:
CREATE TABLE IF NOT EXISTS `items` (
`id` int(11) unsigned NOT NULL,
`irn` varchar(30) NOT NULL,
`name` varchar(225) NOT NULL,
`description` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `name_desc_irn` (`name`,`description`,`irn`),
FULLTEXT KEY `name` (`name`),
FULLTEXT KEY `description` (`description`),
FULLTEXT KEY `irn` (`irn`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
还有下面的数据(假设这里的数据是简化的,现实中我有超过100,000条记录)
id name irn description
1 Widget A ABC12345 testing ABC12345
2 Widget B ABC-12345 the ABC is great
以及以下查询:
SELECT
items.id as id,
items.irn as irn,
items.name as name,
(
((MATCH (irn) AGAINST ('12345')) * 5) +
((MATCH (name) AGAINST ('12345')) * 4) +
((MATCH (description) AGAINST ('12345')) * 3) +
(MATCH(name, description, irn) AGAINST ('12345'))
) AS relevance
FROM
items
WHERE
MATCH(name, description, irn) AGAINST ('*12345' IN BOOLEAN MODE)
HAVING
relevance > 0
ORDER BY
relevance DESC
返回第二个结果(ABC-12345 irn),但不返回第一个结果(ABC12345)。为什么它不匹配 ABC12345 但匹配 ABC-12345?有什么办法可以使用全文搜索来匹配两者吗?如果不是,那么在搜索 12345 时,进行此类搜索(ABC12345 和 ABC-12345 都找到)的最合适方法是什么?
最佳答案
关于 * bool 全文搜索运算符,我能给你的唯一信息是根据 MySQL Manual , "与其他运算符不同,它应该附加到要受影响的词后面。"
对于这种特定类型的查询,您唯一的选择可能是将您的 where 子句更改为如下内容:
WHERE irn LIKE '%12345' OR name LIKE '%12345' OR description LIKE '%12345'
关于mysql - 使用 MySQL 全文搜索匹配部分单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7910928/