2011-10-11 128 views
0

我有一个搜索MySQL数据库来回答问题的PHP搜索脚本。目前我的数据库设置了这样的...使用多个关键字触发数据库搜索结果

ID
问题 =什么时候
答案 =的时间是12:00

然后,这些数据被发送到我的PHP代码:

<?php 

mysql_connect("localhost","username","password"); 
mysql_select_db("database"); 

if(!empty($_GET['q'])){ 
$query=mysql_real_escape_string(trim($_GET['q'])); 
$searchSQL="SELECT * FROM questions WHERE `question` LIKE '%{$query}%' LIMIT 1"; 
$searchResult=mysql_query($searchSQL); 

while($row=mysql_fetch_assoc($searchResult)){ 
$results="{$row['answer']}"; 
} 

echo $results; 
} 

?> 

当前,用户查询必须包含与问题字段完全相同的文本。我的问题是; 我怎样才能使这项工作,所以它触发了一定的几个关键字?

我希望你能理解我的问题

+0

你可以给排序关键字的例子,你想匹配特定的问题吗? – Clive

+0

我认为那种自然语言处理将超出SO Q&A的范围。 –

回答

1

我认为,完整的测试搜索索引可以帮助 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html SOUNDEX功能,可在这方面有用的。 您可以分割查询的关键字,并生成动态SQL,但它是无效的(性能问题SQL注入攻击)看到http://php.net/manual/en/function.split.php

另一种方法是添加表QUESTION_KEYWORD(QUESTION_ID,关键词),分割的问题和搜索这个表找到最好的QUESTION_ID ,但全文搜索索引更高效。实际上,全文搜索索引使用类似的数据结构来优化测试搜索。

0

为便于速战速决根据您的评论,你可以做这样简单的东西:

// Assuming query string is ?q=make,sponge,cake 
$searchSQL="SELECT * FROM questions WHERE "; 
$count = 0; 
foreach (explode(',', $_GET['q']) as $query) { 
    $searchSQL .= "`question` LIKE '%" .mysql_real_escape_string(trim($query)) . "%' "; 
    if ($count++ > 0) { 
    $searchSQL .= ' OR '; 
    } 
} 

$searchSQL .= ' LIMIT 1'; 
$searchResult = mysql_query($searchSQL); 
+0

你可以逆转这个过程,也就是'q =如何制作一个海绵蛋糕',如果可以松动你的匹配(使用'OR'),那么它就可以工作。如果你想要一个选择性的AND,那么恐怕它更像上面所说的自然语言处理 – Clive