首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在match()内对()使用preg_replace()函数

如何在match()内对()使用preg_replace()函数
EN

Stack Overflow用户
提问于 2014-01-14 08:31:05
回答 1查看 5.3K关注 0票数 0

当我试图在全文搜索匹配()之前使用preg_replace()来返回mysql语法错误时,我只是为mysql编译了preg_replace()。我的代码看起来类似于

代码语言:javascript
复制
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行的文件**。

EN

回答 1

Stack Overflow用户

发布于 2014-01-14 10:20:02

如果我们查看一下MATCH...AGAINST,我们可以看到MATCH()需要一个列列表:

MATCH (col1,col2,...) AGAINST (expr [search_modifier]) ..。 MATCH()采用逗号分隔的列表,列出要搜索的列的名称。

但是,您提供了函数调用的结果:

代码语言:javascript
复制
match(name, preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`))

这背后的逻辑是全文搜索被设计为使用在表列上创建的特殊索引来查找内容。不能以随机字符串执行全文搜索。

全文限制一章中还有一个进一步的解释:

MATCH()列列表必须与表的某些全文索引定义中的列列表完全匹配,除非此MATCH()在MyISAM表上处于布尔模式。对于MyISAM表,布尔模式搜索可以对非索引列执行,尽管它们可能比较慢。

编辑:,我不知道你在想什么,但是全文搜索的重点是对自然语言文本执行智能模糊匹配。如果你在搜索前将的“约翰的未婚妻”转换成的“约翰的未婚夫”,那么全文对你没有任何帮助。你确定你不想要很好的老相配吗?

代码语言:javascript
复制
WHERE preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`)='$name'

..。或者子模式匹配?

代码语言:javascript
复制
WHERE preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`) LIKE '%$name%'

无论如何,对任意字符串执行全文的最佳方法是将它们存储到表中。它甚至可以提高性能,原因有两个:

  • 您不需要在每次搜索中重新计算值
  • 实际上,您可以使用全文索引。

您可以手动保持值同步(在每次插入或更新时),也可以编写触发器执行此操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21108917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档