【发布时间】:2020-04-03 14:21:19
【问题描述】:
我正在尝试从针对查询的 mysql 匹配项中删除特定字符(连字符/破折号),因为搜索实际破折号会引发错误。这是我所拥有的,但我收到一个错误,即使用 match+replace 的语法不正确
SELECT *
FROM table
WHERE
MATCH (replace(search_text,'-',''))
AGAINST ('+5552400*' IN BOOLEAN MODE)
“search_text”列的值是 555-2400,我正在尝试匹配。 搜索必须包含通配符。
search_text 可以包含 4 到 500 个字符。它可能是电话号码、电子邮件地址、邮寄地址、名字、姓氏等等。
这是一个自动完成搜索,如果我输入以下任何内容,555-2400 的结果应该会显示出来:
5
55
555
555-
555-2
555-24
555-240
555-2400
【问题讨论】:
-
请提供一个样本数据集以及您想要的输出。对于您期望发生的事情有点困惑,但看起来您想要
AGAINST ('"555-2400"' IN BOOLEAN MODE),它不会像没有引号一样排除2400。由于使用REPLACE(search_text)会消除 FTS 索引带来的任何好处,我认为您最好改用search_text LIKE '%555-2400%'。 -
我希望它是通配符。这是用于自动完成搜索。因此,如果一个人开始输入 555- 它应该将 555-2400 显示为潜在匹配。
-
如果我切换到像 '%555-2400%' 这样的 search_text,查询会明显变慢。该表有几百万条记录。在某些时候,搜索服务器可能是最好的。
-
@Cary 您希望如何处理电子邮件地址搜索,因为
@也不是FULLTEXT索引的有效单词字符,并且代表布尔模式中的距离运算符?这闻起来像键值存储表或无模式结构。有关FULLTEXT的限制和处理电话号码搜索的4 种方法的解释,请参阅我的答案。但我强烈建议您认真考虑重构您的表模式,摒弃接受任何值的概念,或者将该数据移动到像 MongoDB 这样的 NOSQL 数据库,这样可以更好地支持您的需求。 -
对于其他人,来自How to allow fulltext searching with hyphens in the search query 的参考答案有助于 OP
标签: mysql replace full-text-search