【问题标题】:Search multiple table fields with one string, broken apart (MySQL)用一个字符串搜索多个表字段,分开(MySQL)
【发布时间】:2011-05-10 17:20:45
【问题描述】:

我有一个简单的搜索功能,可以在表格中搜索命中。基本上,这种搜索的一个缺陷是它试图完全匹配字符串。我希望它取一串说“大红鸟”并在桌子上分别搜索“大”、“红”和“鸟”。这是我的搜索查询...

$result = mysql_query("SELECT * FROM files
         WHERE (tags LIKE '%$search_ar%' OR
         name LIKE '%$search_ar%' OR
         company LIKE '%$search_ar%' OR
         brand LIKE '%$search_ar%')
         $str_thera $str_global $str_branded $str_medium $str_files");

有什么想法吗?谢谢

编辑 好的,这是我更新后的查询,但它没有返回任何内容。

$result = mysql_query("SELECT * FROM files
           WHERE MATCH(tags, name, company, brand)
           AGAINST ('$seach_ar' IN boolean MODE)"); 

【问题讨论】:

  • 看看全文搜索。

标签: php mysql database search


【解决方案1】:

全文搜索确实会有所帮助,因为您确实有大量数据可供搜索。可以在这里找到一个很好的全文参考:http://forge.mysql.com/w/images/c/c5/Fulltext.pdf

我说大量数据或相当数量的数据的原因是,如果搜索结果产生的返回行占总行数的百分比超过一定百分比,则不会返回任何内容。


如果您想继续使用LIKE 方法,您可以。您只需要分隔单词 (explode) 并使用 AND 将它们加入 sql 查询中:

...(tags LIKE '%$search_ar[0]%' AND tags LIKE '%$search_ar[1]%') OR ....

以这样的方式。此方法可能会变得过于复杂,特别是如果您想返回包含任何单词而不是所有单词的匹配项。所以是的,它需要一些定制来完成和自动化,但这是可能的。

【讨论】:

    【解决方案2】:

    如果出于某种原因,您不能使用全文搜索(好主意,Nick 和 Brad,但只有 MyISAM 支持它,而且据我所知,它并不是那么好),这并不难使用explode()implode() 进行基本搜索:

    $search_arr = explode(' ',$search_str);
    $search_str = implode('%',$search_arr);
    //query where fields like $search_arr
    

    或者:

    $search_arr = explode(' ', $search_str);
       $sql = 'select * from files where ';
       foreach($search_arr = $term){
       $sql .= "tags like '%{$term}%' or " //fill in rest of fields
    }
    

    附带说明:如果您计划增加搜索量并且无法使用 MySQL 的全文搜索,我建议您查看其中一个搜索服务器,例如 Solr 或 Lucene。

    【讨论】:

    • 好的,这是我更新后的查询,但它没有返回任何内容.... $result = mysql_query("SELECT * FROM files WHERE MATCH(tags, name, company, brand) AGAINST ('$seach_ar' IN布尔模式)");
    • @Greg,如果查询返回数据库中超过 50% 的行,它将不会返回任何内容。这就是为什么如果你有一个小数据库,全文并不好。如果你在做测试,这也很难,但只需添加一堆假行来帮助你。 @shauna,是的。这就是我倾向于这样做的方式。我喜欢我的 InnoDB。
    • @Brad - 让我们两个。那到底是怎么回事?就像他们说的,“如果你想要搜索,你就不能有键约束,如果你想要约束,你就不能有搜索。”他们为什么不在 InnoDB 上实现搜索?
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多