当我试图在全文搜索匹配()之前使用preg_replace()来返回mysql语法错误时,我只是为mysql编译了preg_replace()。我的代码看起来类似于
select *, match(name, preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`)) against ('$name') as score
from files
order by score desc..。并触发此错误:
错误1064 (42000):您的SQL语法有错误;请检查与MySQL服务器版本相对应的手册,以获得在“”(‘/^a-Z0-9A-Z+/i’)附近使用的正确语法,“ ”与(“$name”)对应于第1行的文件**。
发布于 2014-01-14 10:20:02
如果我们查看一下MATCH...AGAINST,我们可以看到MATCH()需要一个列列表:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])..。MATCH()采用逗号分隔的列表,列出要搜索的列的名称。
但是,您提供了函数调用的结果:
match(name, preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`))这背后的逻辑是全文搜索被设计为使用在表列上创建的特殊索引来查找内容。不能以随机字符串执行全文搜索。
在全文限制一章中还有一个进一步的解释:
MATCH()列列表必须与表的某些全文索引定义中的列列表完全匹配,除非此MATCH()在MyISAM表上处于布尔模式。对于MyISAM表,布尔模式搜索可以对非索引列执行,尽管它们可能比较慢。
编辑:,我不知道你在想什么,但是全文搜索的重点是对自然语言文本执行智能模糊匹配。如果你在搜索前将的“约翰的未婚妻”转换成的“约翰的未婚夫”,那么全文对你没有任何帮助。你确定你不想要很好的老相配吗?
WHERE preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`)='$name'..。或者子模式匹配?
WHERE preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`) LIKE '%$name%'无论如何,对任意字符串执行全文的最佳方法是将它们存储到表中。它甚至可以提高性能,原因有两个:
您可以手动保持值同步(在每次插入或更新时),也可以编写触发器执行此操作。
https://stackoverflow.com/questions/21108917
复制相似问题