MySQL InnoDB 包含电子邮件地址的全文搜索

问题描述 投票:0回答:5

我在 2 台 Mac 笔记本电脑上安装了 mysql 社区 5.6.13 - 一台操作系统为 os x 10.8,另一台操作系统为 os x 10.9。

据我所知,mysql 的安装是相同的,但相同的全文搜索在每次安装上的行为不同。

我的疑问是:

SELECT legal_matter.* FROM legal_matter 
left join user_account 
on user_account.id = legal_matter.lawyer_id 
left join client_account 
on client_account.id = legal_matter.client_account_id 
WHERE MATCH (legal_matter.question) AGAINST ('[email protected]' IN BOOLEAN MODE) 
OR user_account.username like '%[email protected]%' 
OR legal_matter.display_name like '%[email protected]%' 
OR client_account.company_name like '%[email protected]%' 

在 10.8 的笔记本电脑上,查询正常执行,在 10.9 的笔记本电脑上,查询抱怨:

Error Code: 1064. syntax error, unexpected '@', expecting $end 

TI 不知道它是否与不同的操作系统版本有关,我怀疑不是,但我不知道问题是什么。

非常感谢您的指点。

谢谢。

mysql
5个回答
7
投票

我有一些查询使用了针对电子邮件的匹配,当我切换到 innodb 时,这些查询开始失败,因为 @ 用于在 InnoDB 中搜索相隔一定距离的单词:

SELECT username FROM users WHERE MATCH(user_email) AGAINST('[email protected]' IN BOOLEAN MODE);
ERROR 1064 (42000): syntax error, unexpected '@', expecting $end

SELECT username FROM users WHERE MATCH(user_email) AGAINST("[email protected]" IN BOOLEAN MODE);
ERROR 1064 (42000): syntax error, unexpected '@', expecting $end
mysql>

尝试像这样包装您的电子邮件地址:

SELECT username FROM users WHERE MATCH(user_email) AGAINST('"[email protected]"' IN BOOLEAN MODE);

或逃脱:

SELECT username FROM users WHERE MATCH(user_email) AGAINST('\"[email protected]\"' IN BOOLEAN MODE);

1
投票

@ 符号是一个运算符,与布尔搜索冲突...它不应该...它是一个错误。

这篇文章,指出更有可能是InnoDB和MyISAM的问题...

https://bugs.mysql.com/bug.php?id=74042

也许,您在一台机器的数据库上有 MyISAM...不知道。


1
投票

背景是什么?

mysql
命令行工具? shell脚本?爪哇? PHP?其他?我怀疑这个问题的答案会导致什么改变。

很可能在

@
之前加
\
可以修复它。该修复可能在两个操作系统中都有效。

你知道投诉是针对

@
中的
AGAINST
吗?还是全部
@
?尝试将
@
中的
AGAINST
替换为空格。

那么,由于“律师”和“域名”可能并不相邻,所以可能需要说

MATCH(question) AGAINST('+lawyer +domain +com +au' IN BOOLEAN MODE)
  AND question LIKE     '%[email protected]%'`

FT给你性能;

LIKE
仔细检查结果。

警告:除非您将最小标记大小设置为 2,否则

+au
将导致零命中。一种解决方法是不在任何短于最小标记大小的“单词”上使用
+
。 (
LIKE
覆盖了你。)


0
投票

用于搜索

[email protected]

SELECT *, 
       MATCH(email) AGAINST ('+reymysterio* +619* +gmail* +com*' IN BOOLEAN MODE) AS relevance,
       email LIKE '[email protected]%' AS exact_match_relevance
FROM wrestlers
WHERE MATCH(email) AGAINST ('+reymysterio* +619* +gmail* +com*' IN BOOLEAN MODE) 
ORDER BY exact_match_relevance DESC, relevance DESC;

在此处查看完整答案:https://stackoverflow.com/a/78374147/19456215


-1
投票

尝试使用此语法:

SELECT legal_matter.* FROM legal_matter 
left join user_account 
on user_account.id = legal_matter.lawyer_id 
left join client_account 
on client_account.id = legal_matter.client_account_id 
WHERE MATCH (legal_matter.question) AGAINST ('[email protected]' IN BOOLEAN MODE) 
OR user_account.username like '%[email protected]%' 
OR legal_matter.display_name like '%[email protected]%' 
OR client_account.company_name like '%[email protected]%' 
© www.soinside.com 2019 - 2024. All rights reserved.