我正在为 CRM 系统的联系人数据库表(MySQL、InnoDB 引擎)添加“通过电子邮件搜索”功能。我添加了全文索引和部分搜索,如下所示
WHERE MATCH(cc.email_c) AGAINST('Joe' IN NATURAL LANGUAGE MODE)
工作正常。但是,如果我尝试匹配这样的完整电子邮件地址
WHERE MATCH(cc.email_c) AGAINST('[email protected]' IN NATURAL LANGUAGE MODE)
所有包含 Gmail 的电子邮件地址都会被返回。我已经放弃了使用布尔模式的可能性,据我了解,它不支持查询中的“@”符号。是否有其他方法可以使用 MATCH AGAINST,同时仍然能够通过确切的完整地址进行搜索?
我总是可以使用带有 LIKE 和一些通配符的 SQL,但我仍然更喜欢进行全文搜索。
您可以简单地将电子邮件用双引号(“”)括起来,如下所示:
WHERE MATCH(cc.email_c) AGAINST("[email protected]" IN NATURAL LANGUAGE MODE)
将其转换为
AGAINST('+Joe +gmail +com' IN BOOLEAN MODE)
但是,要小心;短名称和“停用词”前面不应有“+”。
然后,因为它不够精确,所以结合
LIKE
:
WHERE MATCH(email) AGAINST('+Joe +gmail +com' IN BOOLEAN MODE)
AND email LIKE '%[email protected]%'
第一部分给你速度;第二部分将仅测试通过第一个测试的那些。