2012-03-06 84 views
4

我有一个MySQL的MyISAM表,全文索引,这样的:如何使用全文索引进行精确匹配?

CREATE TABLE `tblsearch` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(100) NOT NULL, 
    `brand` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    FULLTEXT KEY `index_all` (`title`,`brand`) 
) ENGINE=MyISAM AUTO_INCREMENT=1316109 DEFAULT CHARSET=utf8; 

现在我需要编写一个查询来找到确切的名称和品牌的所有条目:

SELECT id FROM tblsearch WHERE title=?title AND brand=?brand; 

查询只给出完全匹配非常重要。我希望能够使用我已有的全文索引。是否可以编写查询,以便使用全文索引?

回答

2

事情是这样的:

SELECT id 
    FROM tblsearch 
WHERE MATCH (title, brand) AGAINST ("exact phrase") 
    AND CONCAT(title, ' ', brand) LIKE '%exact phrase%'; 

希望它可以帮助

+0

我需要两个?title和?品牌作为两个不同的参数,这可能吗? – Martin 2012-03-06 09:37:48

+0

你的代码尝试结合标题和品牌参数,并用它来代替“确切短语”。 – 2012-03-06 09:39:46

+0

好的,谢谢!如果您在此查询中使用“like”%精确短语%'“ - 是否可以使用,还是会影响性能?该表有大约一百万条目。 – Martin 2012-03-06 09:51:27

1

如果你需要找到确切的标题或品牌,你需要使用等于运算符和经典指数:

ALTER TABLE tblsearch ADD INDEX search_idx(title, brand); 
SELECT id FROM tblsearch WHERE title = 'foo' AND brand = 'bar'; 

现在,如果您只需要将标题和品牌中的确切单词匹配起来:

SELECT id FROM tblsearch WHERE 
MATCH(title) AGAINST('+foo' IN BOOLEAN MODE) 
AND MATCH(brand) AGAINST('+bar' IN BOOLEAN MODE);