【问题标题】:MySQL return results with words missingMySQL 返回结果缺少单词
【发布时间】:2013-09-06 14:30:51
【问题描述】:

我有一个网站,其中包含销售手机和平板电脑的搜索字段。如果您搜索Blackberry 9900,它不会返回任何结果,因为产品名为Blackberry Bold 9900。如果缺少单词,我需要一个显示相关产品的解决方案。

我试过了:

$words=explode("_",$name);
foreach($words as $word){
   $whereClause.= ' product_name LIKE "%'.$word.'%" OR';
}
$whereClause=substr($whereClause,0,-2);
$productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';

如果您搜索Blackberry Bold 9900,则会返回所有包含Blackberry 的结果。 我该如何解决这个问题,以使结果具有相关性?

【问题讨论】:

  • 在您的情况下 - 使用 AND 而不是 OR。正确的解决方案是为此目的使用FULLTEXT 索引。
  • 而不是像使用mysql的匹配查询
  • 类似SELECT * FROM products WHERE MATCH (product_name) AGAINST ('$words') AND status=1 AND deleted=0 ORDER BY product_order

标签: php html mysql search


【解决方案1】:

您需要考虑使用 FULLTEXT,因为 LIKE 运算符在这里对您没有帮助。

【讨论】:

  • 使用 mysql 的匹配查询,它会做你想做的事,并将表类型更改为 innodb 或 myisam(两个搜索中的一个),
  • 搜索“PHP MySQL全文示例”。这是一个:tuxradar.com/practicalphp/9/3/18
【解决方案2】:

改变

$whereClause.= ' product_name LIKE "%'.$word.'%" OR';

$whereClause.= ' product_name LIKE "%'.$word.'%" AND';

$whereClause=substr($whereClause,0,-3);

当然。

这将只搜索名称包含搜索框中所有个单词的产品(但不必只搜索那些单词)。

也许 MySQL FULLTEXT 搜索是更好的方法,但它仅支持 MySQL 5.6 之前的 MyISAM 表。

【讨论】:

    【解决方案3】:

    如果你真的想用like运算符,那么你可以试试这样的:

    SELECT * 
    FROM  products 
    WHERE title LIKE  '%Blackberry%9900%'
    

    我的意思是只有一个运算符你可以使用几个 % 字符。

    所以你的代码将是:

    $words=explode("_",$name);
    $whereClause=' product_name LIKE "';
    foreach($words as $word){
       $whereClause.= '%'.$word;
    }
    $whereClause.='%"';
    $productQuery='SELECT * FROM products WHERE'.$whereClause.' AND status=1 AND deleted=0 ORDER BY product_order';
    

    但是,如果您的产品表很大(可能 > 600k 行),那么这个表会很慢。 所以最好使用 FULLTEXT,因为如果使用得当,它会更快,我怎么知道。

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多