【问题标题】:MySQL Search String with Spaces Using LIKEMySQL 使用 LIKE 搜索带空格的字符串
【发布时间】:2013-01-10 17:54:49
【问题描述】:

我正在我的网站上构建搜索,但我注意到当您在搜索中输入多个单词时它不起作用。以下是查询的要点:

SELECT * FROM `blog` WHERE `content` LIKE '%$keyword%' OR `title` LIKE '%$keyword%' ORDER BY `id` DESC

奇怪的是,当我在 phpMyAdmin 中测试查询时,它返回了预期的结果。然而,在我的网站上,没有找到任何结果。

我尝试用 %s 替换关键字中的空格,但这并没有改变任何东西。

【问题讨论】:

  • 因此,如果您搜索“Jon Stewart”,则会导致将 %Jon Stewart% 作为一个词一起搜索。它不会找到与“乔恩”或“斯图尔特”相关的条目。如果要将它们用作关键字,则需要拆分字符串并为要搜索的每个元素动态创建 where 子句
  • 我可以搜索组合字符串,例如“Jon Stewart”。这就是为什么我很困惑它不起作用。

标签: php sql-like


【解决方案1】:

问题在于LIKE 进行模式匹配而不是实际搜索关键字。您应该在数据库列上创建全文索引并使用WHERE MATCH keywords AGAINST column。这将以任何顺序正确搜索所有关键字,并且速度更快。

【讨论】:

  • 看起来 MATCH AGAINST 是我正在寻找的。搜索了一下,发现:“在做你网站的搜索功能时。Match and Against 比 Like sql 语句好。字段必须设置为 FullText 匹配字段上的术语:例如 SELECT field1,field2 FROM table_name WHERE MATCH(field1,field2) AGAINST('keyword') AND field1 = '1' 也可以使用IN BOOLEAN MODE来允许sql语句中的运算符。例如... MATCH(field1,field2) AGAINST('-freak +hellfish' IN BOOLEAN MODE) ..." 所以我现在的问题是如何将列更改为'全文'?我不认为这是一种选择。
  • 只是谷歌“MySQL 创建全文索引”之类的。
  • 实际上它看起来工作正常,一个是tinytext,另一个是longtext。此外,我的查询似乎存在问题,部分原因是它是通过 url 发送的,而空格是 '%20's。我可以从这里拿走,谢谢你的回复。
  • 在 phpMyAdmin 你去你想要的表 -> 结构。然后在底部有详细信息。然后为 1 列添加索引,然后选择全文。
【解决方案2】:

我刚刚在我的数据库中尝试过这个,在查询中使用 LIKE 比在全文索引中使用 MATCH 快 66 倍以上。我正在使用两个相互“连接”的表。一个是标签,一个是产品。

所以我所做的就是在标签表中的标签列中添加一个全文索引,并针对该列执行匹配。查询然后加入产品,然后吐出一些关于该项目的数据。大约 4 秒,大约 3000 个产品和大约 3000 个标签。

然后我尝试了先用空格分解搜索字符串,然后用%' OR tags.tag LIKE '% 分解结果。对于相同数量的产品和标签,这大约需要 0.06 秒。

【讨论】:

    猜你喜欢
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多