gpt4 book ai didi

mysql - 如何在 mysql match() against () 中使用 preg_replace() 函数

转载 作者:行者123 更新时间:2023-11-29 08:13:21 25 4
gpt4 key购买 nike

当我尝试在全文搜索 match () against () 之前使用 preg_replace() 时,我刚刚为 mysql 编译了 preg_replace() 它返回 mysql 语法错误。我的代码看起来类似于

select *, match(name, preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`)) against ('$name') as score
from files
order by score desc

...并触发此错误:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('/[^a-z0-9A-Z]+/i', ' ', column)) against ('$name') as score from files ' at line 1

最佳答案

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

MATCH (col1,col2,...) AGAINST (expr [search_modifier])
[...]
MATCH() takes a comma-separated list that names the columns to be searched

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

match(name, preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`))

其背后的逻辑是全文搜索旨在使用在表列上创建的特殊索引来查找内容。您无法在随机字符串中执行全文搜索。

Full-Text Restrictions中有进一步的解释章节:

The MATCH() column list must match exactly the column list in some FULLTEXT index definition for the table, unless this MATCH() is IN BOOLEAN MODE on a MyISAM table. For MyISAM tables, boolean-mode searches can be done on nonindexed columns, although they are likely to be slow.

<小时/>

编辑:我不知道您在想什么,但全文搜索的全部目的是对自然语言文本执行智能模糊匹配。如果您在搜索之前将“John's fiancee”转换为“Johns fiance”,那么全文对您没有任何帮助。您确定不想要良好的旧式精确匹配吗?

WHERE preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`)='$name'

...或子模式匹配?

WHERE preg_replace('/[^a-z0-9A-Z]+/i', ' ', `column`) LIKE '%$name%'

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

  • 您无需在每次搜索时重新计算值
  • 您实际上可以使用全文索引

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

关于mysql - 如何在 mysql match() against () 中使用 preg_replace() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21108917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com