从mysql数据库关键字缩小搜索结果

时间:2012-09-27 23:10:20

标签: mysql database search-engine

我有一个包含过滤器公司部件号的大型数据库。有些产品的年份和型号相似。我有一个PHP脚本,正在搜索每个部分的文本关键字部分。

因此对于1997-1999 Honda Crf 250 090987 19.95,关键字是: 1997 1998 1999 honda crf 250 090987

我从教程中获取了代码,并编写了搜索关键字部分以查找由空格分隔的所有内容。问题是很多房源都有本田或类似的年度差价。

我需要弄清楚如何改变php以缩小结果,所以如果有人输入“1997 honda”,所有的hondas和'97s都不会出现,只有1997年的hondas。

我是php的新手,我看了四周,无法弄明白。任何帮助都将得到彻底的赞赏。

这是php:     

$keywords = $_GET['keywords'];
$terms = explode(" ", $keywords);
$query = "SELECT * FROM search WHERE ";

foreach ($terms as $each){
    $i++;
    if ($i == 1)
        $query .= "keywords LIKE '%$each%' ";
else
    $query .= "OR keywords LIKE '%$each%' ";

}


// connect
mysql_connect("localhost", "root", "root");
mysql_select_db("catalog");

$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows > 0){

    while ($row = mysql_fetch_assoc($query)){
        $id = $row['id'];
        $year = $row['year'];
        $manufacturer = $row['manufacturer'];
        $product = $row['product'];
        $partnumber = $row['partnumber'];
        $price = $row['price'];

        echo "<div id=\"results\">
        <div class=\"words\">$year</div><div class=\"words\">$manufacturer</div><div class=\"words\">$product</div><div class=\"words\">$partnumber</div>$price<br /></div>";
    }
}
else
    echo "<div class=\"no_results\"><center>No results found for \"<b>$keywords</b>\"</center></div>";


// disconnect
mysql_close();

&GT;

3 个答案:

答案 0 :(得分:0)

在查询中使用AND而非OR强制所有关键字必须匹配,否则一个关键字匹配将始终返回结果。除此之外,您将不得不在代码中进行一些相关性工作,这可能会降低应用程序的速度。

答案 1 :(得分:0)

有趣的问题。

我想到了两种方法:

(1)如果你可以控制数据库结构,你可以选择WHERE(make ='Honda'和年份IN(1997,1998,1999))和你已经拥有的“喜欢”的东西(没有make /年)。但是你需要将模型年分开并分成不同的领域。

(2)否则,如果我们可以假设输入始终为“年份制作[其他关键字]”,我们可以在我输入时使用izuriel建议的内容,只需“AND'keywords ='1997'和关键字='honda'AND(我们现有的“喜欢”条款列表)“。

通过这种方式,您只能拥有拥有任何或所有其他关键字的1997 Hondas。

答案 2 :(得分:0)

我建议您在单词的末尾使用一个符号百分比,而不是或者您在查询中限制数据库是否很大