mysql php搜索引擎查询多列

时间:2014-12-13 12:33:54

标签: php mysql

所以我目前正忙着创建一个兴趣爱好的搜索引擎,并且好奇我能不仅仅查询mysql数据库中的关键字列。目前我能够搜索某些内容并根据我的“关键字”列获得结果。但是,如果我搜索的单词或短语不在关键字列中,但在标题栏或说明栏中找到它是否可能会显示,因为它在那些列中找到了它?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <title>Search Engine - Search</title>
</head>
<body>

    <h2>Search Engine</h2>
    <form action='./search.php' method='get'>
        <input type='text' name='k' size='50' value='<?php echo $_GET['k']; ?>' />
        <input type='submit' value='Search'>
    </form>
    <hr />
    <?php
        $k = $_GET['k'];
        $terms = explode(" ", $k);
        $query = "SELECT * FROM databeast WHERE ";

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

        //connect
        mysql_connect("localhost", "username", "password");
        mysql_select_db("fapster") or die(mysql_error());

        $query = mysql_query($query);
        $numrows = mysql_num_rows($query);
        if ($numrows > 0) {
            while ($row = mysql_fetch_assoc($query)){
                $url = $row['url'];
                $title = $row['title'];
                $keywords = $row['keywords'];

                echo "<h1><a href='$url'>$title</a></h1>
                $keywords<br /><br />";
            }
        }

    ?>
</body>
</html>

提前致谢

1 个答案:

答案 0 :(得分:0)

我建议您查看MySQL全文搜索。 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

这允许您在查询中搜索多个关键字。此外,全文为您提供了将单词理解为“自然语言”的好处(因此它处理“停用词”,“复数”和“词干”)。见http://dev.mysql.com/doc/refman/5.0/en/fulltext-query-expansion.html

不要抛弃“赞”逻辑。 MySQL全文搜索有一些烦人的事情 - 所以你可能仍然想要使用那个逻辑。他们在这里:

  1. 返回“太多”(%50或更高)结果的搜索不返回任何内容。不是搜索者通常所期望的,对吧?通常人们希望它像谷歌一样工作。
  2. 搜索太短的单词不返回任何内容(请参阅/etc/my.sql中的ft_min_word_len)
  3. 通常我会将全文搜索与“或”或“或”搜索相结合,然后按全文排名组合。

    P.S。你的脚本易受SQL注入攻击。在审核之前不要发布到Internet上。