将精确值与MyISAM中的FullText搜索匹配

时间:2014-02-18 21:15:27

标签: php mysql search full-text-search myisam

我有一个包含2列的表格作为电子邮件和ID。我想在列中搜索完全匹配的电子邮件值。

我已使用MyISAM Engine设置了我的表,并使用FullText索引设置了Email列。当我运行查询以搜索完全匹配时,它有时会起作用,有时会失败。

这是我的表定义

CREATE TABLE `tbl_email` (
    `email` varchar(60),
    `uid` int(11)
    FULLTEXT KEY `EmailIndex` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

这是我的查询以匹配我的电子邮件值

select uid from tbl_email where MATCH(email) AGAINST ('abcdefghi@yahoo.com') 
limit 1;

它有时会工作,有时即使表中存在匹配结果,也无法返回匹配结果。我做错了吗?我该怎么做才能匹配FullText搜索中的确切值?

我也尝试过使用 IN BOOLEAN MODE ,但这样就没用了

select uid from tbl_email where MATCH(email) AGAINST ('abcdefghi@yahoo.com' 
IN BOOLEAN MODE) limit 1;

3 个答案:

答案 0 :(得分:0)

您不必使用全文匹配,只需运行:

SELECT uid FROM tbl_email WHERE email='abcedfghi@yahoo.com' LIMIT 1;

该查询应该返回您想要获取的内容。

答案 1 :(得分:0)

根据MySQL 5.5 reference page使用FULLTEXT查找确切短语时,您可以将它们用单引号和双引号括起来。单引号是分隔符,而双引号封装了您的查询。

e.g。 :... MATCH(email) AGAINST('"someone@example.com"') ...

然而,回应其他人已经说过的话,一个简单的WHERE子句将从查询的外观中获取。我认为FULLTEXT更适合在记录中的大量信息中查找关键字,而不是像电子邮件字段那样的单值字段。

答案 2 :(得分:0)

据我所知,FullText索引搜索将搜索字符串解释为自然人类语言中的短语,如果需要进行搜索,如http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html所述,最重要的是查看

* 禁用词汇表适用。此外,50%或更多行中出现的单词被认为是常见的并且不匹配。 *

我相信您的每封电子邮件都会包含 .com (。作为停用词),这意味着您的整个表格将与您提供的搜索相匹配。

你最好使用InnoDB进行简单的索引,因为它可以更快地插入记录并简化where子句。

我不知道什么算法用于FullText搜索而不是字符串搜索的普通索引,但假设你使用FullText索引进行,我想由于不同的解释它将需要比普通索引更多,因为它将不得不查看每个电子邮件值,因为所有电子邮件都有像@和.com等停止的单词。但这只是我的理解我不是数据搜索算法制造商。