使用MySQL全文搜索匹配部分单词?

时间:2011-10-27 01:53:54

标签: mysql full-text-search

我有以下数据库模式,例如:

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时,哪种搜索方式最适合进行此类搜索?

1 个答案:

答案 0 :(得分:2)

我可以在*布尔全文搜索运算符上给出的唯一信息是,根据MySQL Manual,“与其他运算符不同,它应该附加到要受影响的单词。”

此特定类型查询的唯一选择可能是将where子句更改为:

WHERE irn LIKE '%12345' OR name LIKE '%12345' OR description LIKE '%12345'