我有一个包含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;
答案 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等停止的单词。但这只是我的理解我不是数据搜索算法制造商。