我有一个包含 2 列的表格,分别是电子邮件和 ID。我想在列中搜索完全匹配的电子邮件值。
我已经使用 MyISAM 引擎设置了我的表,并使用全文索引设置了电子邮件列。当我运行查询以搜索完全匹配时,它有时会成功,有时会失败。
这是我的表格定义
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;
有时可以,有时即使表中有匹配结果也无法返回匹配结果。我做错了什么吗?我应该怎么做才能在全文搜索中匹配精确值?
我也试过使用 IN BOOLEAN MODE 但同样没用
select uid from tbl_email where MATCH(email) AGAINST ('abcdefghi@yahoo.com'
IN BOOLEAN MODE) limit 1;
最佳答案
据我所知,全文索引搜索将搜索字符串解释为自然人类语言中的一个短语,并在必要时中断单词以进行搜索,如 http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html 中所述最重要的看这里
*停用词列表适用。此外,出现在 50% 或更多行中的词被认为是常见的并且不匹配。 *
而且我相信您的每封电子邮件中都会包含 .com(. 作为停用词),这意味着您的整个表格都将与您提供的搜索相匹配。
您最好使用 InnoDB 进行简单索引,因为它可以更快地插入记录并制作简单的 where 子句。
我不知道全文搜索使用什么算法,而不是字符串搜索的普通索引,但假设如果您使用全文索引进行搜索,我想由于不同的解释,它需要比普通索引更多的时间,因为那样的话将不得不查看每个电子邮件值,因为它们都有停用词,例如 @ 和 .com 等。但这只是我的理解,我不是数据搜索算法制造商。
关于php - 在 MyISAM 中使用全文搜索匹配精确值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21865476/