【问题标题】:MySQL Query multiple keywords searching in long string using PhpMySQL使用Php在长字符串中查询多个关键字搜索
【发布时间】:2012-08-05 07:28:03
【问题描述】:

例如关键字搜索“洗车”
无论位置如何,洗车都必须出现在字符串中

可搜索的字符串可能很长,查询应该一起搜索这些关键字,并分别搜索。可以有两个以上的关键字。

$query="SELECT * FROM TABLE WHERE zip LIKE'abc'";
$key= explode(" ", $keywords);
for($i = 0; $i < count($key); $i++){
    $query.=" AND (dealTitle LIKE '".$key[$i]." %' OR dealTitle LIKE '% ".$key[$i]." %' OR dealTitle LIKE '% ".$key[$i]." ')";
    }

但是,查询返回那些包含“car”“wash”的记录。

如果我使用“洗车”,这两个词至少需要出现一次。关于如何修改我的搜索以考虑此条件的任何建议?

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    试试这个:

       AND (CONCAT(' ',dealTitle,' ') LIKE '% car %' and 
       CONCAT(' ',dealTitle,' ') LIKE '% wash %' )
    

    【讨论】:

    【解决方案2】:
    for($i = 0; $i < count($key); $i++){
            $query.=" AND (dealTitle rlike '[[:<:]]".$key[$i]."[[:>:]]' )";
    }    
    

    应该使用 AND

    编辑:

    for($i = 0; $i < count($key); $i++){
                $query.=" AND (dealTitle like '% ".$key[$i]." %' or dealTitle like '% ".$key[$i]."' or dealTitle like '".$key[$i]."%') ";
        }    
    

    【讨论】:

    • 同样的问题,它也会接受关键字“CARD”以及汽车
    • 如果字符串中没有洗,它会返回关键字“CAR”??
    • 你想要的是洗车必须出现在字符串中,无论位置如何,我理解正确吗?
    • 要满足精确的字符串,请使用[[:&lt;:]]car[[:&gt;:]]。修改了我的答案,请尝试。在这种情况下,将只返回结果与 car 和wash 一起出现在字符串中,因为使用了AND
    • 您可以尝试我编辑的答案。顺便说一句,我认为这与您现有的查询相同吗?
    【解决方案3】:

    如果您使用的是 mysql 数据库,则有一个全文搜索功能,这将是一个强大且可扩展的解决方案。

    $query .= " AND MATCH(dealTitle) AGAINST('". $searchString ."')";
    

    http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html#function_match

    阅读本文以了解 MySQL 中的 FULLTEXT SEARCH 功能。

    【讨论】:

    • 这里是错误 #1214 - 使用的表类型不支持 FULLTEXT 索引
    • 那么可以在这个列上引入FULLTEXT索引吗?
    【解决方案4】:

    试试这个查询:-

    AND (dealTitle LIKE '%car wash%' )
    

    【讨论】:

      【解决方案5】:

      您基本上是在尝试实现搜索引擎的功能——全文索引。如您所知,LIKE '%keyword%' 是部分匹配。它不仅命中部分单词,而且非常慢,因为数据库必须读取和比较磁盘上的每条记录。

      考虑使用全文索引器。 MySQL 专门支持它。见FULLTEXT

      【讨论】:

        猜你喜欢
        • 2013-04-25
        • 2011-09-28
        • 2018-12-16
        • 2013-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多