2008-09-30 147 views

回答

21

是的,最有效的方式通常是在数据库中搜索。要做到这一点,你有三种选择:

  • LIKE, ILIKE精确匹配子
  • RLIKE匹配POSIX正则表达式
  • FULLTEXT索引,以匹配另一个三种不同类型的搜索的目的是自然语言处理

所以这取决于你将要实际寻找什么来决定什么是最好的。对于书名,我会提供一个LIKE搜索确切的子字符串匹配,当人们知道他们正在查找的书以及FULLTEXT搜索以帮助找到类似单词或短语的标题时非常有用。我当然会在界面上给他们不同的名字,可能类似于子字符串搜索和类似的全文搜索。

约全文一个例子:http://www.onlamp.com/pub/a/onlamp/2003/06/26/fulltext.html

+0

斯芬克斯会为此工作吗? – 2016-03-05 18:09:02

10

这里有一个简单的方法,你可以掰开一些关键字建立一些条款对这些关键字过滤列,无论是AND或OR在一起。

$terms=explode(',', $_GET['keywords']); 
$clauses=array(); 
foreach($terms as $term) 
{ 
    //remove any chars you don't want to be searching - adjust to suit 
    //your requirements 
    $clean=trim(preg_replace('/[^a-z0-9]/i', '', $term)); 
    if (!empty($clean)) 
    { 
     //note use of mysql_escape_string - while not strictly required 
     //in this example due to the preg_replace earlier, it's good 
     //practice to sanitize your DB inputs in case you modify that 
     //filter... 
     $clauses[]="title like '%".mysql_escape_string($clean)."%'"; 
    } 
} 

if (!empty($clauses)) 
{ 
    //concatenate the clauses together with AND or OR, depending on 
    //your requirements 
    $filter='('.implode(' AND ', $clauses).')'; 

    //build and execute the required SQL 
    $sql="select * from foo where $filter"; 
} 
else 
{ 
    //no search term, do something else, find everything? 
} 
1

Paul Dixon的代码示例为基于LIKE的方法获得了良好的主要思想。 (AND | OR)单选按钮在界面中设置,默认为AND,那么如果用户的查询结果为零(0)匹配且包含至少两个单词,有一个选项,效果作出回应:

“对不起,没有匹配被发现的搜索短语展开搜索,以匹配任何单词这句话在你

也许有一个更好的办法?去说这个,但是基本的想法是引导这个人走向另一个查询(可能会成功),用户不必用AND和OR的布尔逻辑思考。

2

考虑使用sphinx。这是一个开源的全文引擎,可以直接使用你的mysql数据库。它比手工编写的LIKE语句更具可扩展性和灵活性(并且对SQL注入的影响要小得多)

1

我认为如果是单词,Like就是最有效的方法。正如已经说过的那样,多个单词可能会与爆炸函数分开。然后它可以循环并用于通过数据库单独搜索。如果返回两次相同的结果,可以通过将值读入数组来检查。如果它已经存在于数组中,则忽略它。然后通过计数功能,您可以知道在循环打印时停止的位置。可以用similar_text函数来完成排序。百分比用于对数组进行排序。这是最好的。

相关问题