【问题标题】:How to use prefix wildcards like '*abc' with match-against如何在 match-against 中使用前缀通配符,如 '*abc'
【发布时间】:2023-03-04 18:40:01
【问题描述】:

我有以下疑问:

SELECT * FROM `user` 
WHERE MATCH (user_login) AGAINST ('supriya*' IN BOOLEAN MODE)

输出所有以'supriya'开头的记录。
现在我想要一些可以找到所有以例如结尾的记录的东西。 'abc'.
我知道 * 不能预先附加,它也不起作用,我搜索了很多,但找不到任何关于此的内容。

如果我查询字符串priya ..它应该返回所有以priya结尾的记录。
我该怎么做?

【问题讨论】:

  • 您可以执行 WHERE user_login LIKE '%priya' 但这可能是您可以执行的最慢查询之一。
  • 请改进您的问题标题。

标签: mysql match


【解决方案1】:

匹配不适用于起始通配符,因此与 *abc* 匹配将不起作用。您必须使用LIKE 来实现此目的:

SELECT * FROM user WHERE user_login LIKE '%abc';

不过这会很慢。

如果您确实需要匹配字符串的结尾,并且您必须经常在性能影响您的情况下执行此操作,一个解决方案是创建一个单独的列来反转字符串,因此您得到:

user_login user_login_rev
xyzabc     cbazyx

然后,您可以查找'cba%',而不是查找'%abc',如果该列被索引,这会更快。如果您想搜索'cba*',您可以再次使用 MATCH。您也只需要反转搜索字符串。

【讨论】:

  • 谢谢!!这听起来像是一个很好的解决方法,但我必须在一个已经存在的数据库中实现它,该数据库非常大,并且反转所有现有数据将非常乏味。仍然需要考虑一些事情:)
  • 如果添加列,一次更新所有行,然后编写触发器以保持反转列同步,您应该完成。这需要一些额外的空间,但除此之外,它应该很容易实现。
  • 非常好的解决方案!.. 但与like %abc%相比,它的速度有多快
  • 就像我在回答中所说的那样,起始通配符使它变慢,因为不再使用索引。实际差异在很大程度上取决于记录的数量、值的长度、索引的质量以及可能还有很多其他因素。
  • 请注意,如果您想从字符串中间查找内容,反转字符串对您没有帮助。使用普通索引键入“Blue%”或使用倒置 inices 反转“Blue%”,您不会找到“Jimmy Blue Jones”。
【解决方案2】:

我相信FULL-TEXT Searching 的选择与这里无关。如果您有兴趣根据通配符搜索某些字段,例如:

  • %word%(字符串中任意位置的单词)
  • word%(以word开头)
  • %word(以word结尾)

最好的选择是使用 GolezTrol 提到的 LIKE 子句。

但是,如果您对基于高级/文本的搜索感兴趣,则可以选择FULL-TEXT 搜索。

LIKE 的限制:

此条款有一些限制。假设您使用类似 '%good' 的东西(任何以 good 结尾的东西)。它可能会返回不相关的结果,例如goodsgoody

因此,请确保您了解自己在做什么以及需要什么。

【讨论】:

  • '%word' 的最大限制是不能使用索引。这可能会影响你的表现。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多