数据库搜索,如谷歌

时间:2013-11-16 18:16:01

标签: php mysql sql database search

我目前在PHP + MYSQL网站上有一个搜索选项。

MYSQL查询目前类似于“SELECT pageurl WHERE name LIKE'%$ query%'。

我在这里发布的原因是因为我注意到如果我的某个产品的名称是“Blue Bike”并且有人查找“Bike Blue”,则不会返回任何结果。

我正在寻找解决方法,因为我知道如果我输入谷歌相同的单词,会出现一些问题。

我正在考虑创建一个PHP函数,以便在查询包含4个或更少的单词时混合查询中的所有单词,生成大约24个查询。

对此有更简单的解决方案吗?

感谢您的时间

6 个答案:

答案 0 :(得分:5)

如果没有合适的答案,不要放手:

<?php
    $search = 'this is my search';

    $searchSplit = explode(' ', $search);

    $searchQueryItems = array();
    foreach ($searchSplit as $searchTerm) {
        /*
         * NOTE: Check out the DB connections escaping part 
         * below for the one you should use.
         */
        $searchQueryItems[] = "name LIKE '%" . mysqli_real_escape_string($searchTerm) . "%'";
    }

    $query = 'SELECT pageurl FROM names' . (!empty($searchQueryItems) ? ' WHERE ' . implode(' AND ', $searchQueryItems) : '');
?>

数据库连接转义

<强>的mysqli _

继续使用mysqli_real_escape_string或使用$mysqli->real_escape_string($searchTerm)

<强>的MySQL _

如果您使用mysql_,则应使用mysql_real_escape_string($searchTerm)(并考虑因弃用而更改)。

<强> PDO

如果您使用PDO,则应使用trim($pdo->quote($searchTerm), "'")

答案 1 :(得分:3)

您正在寻找的是全文搜索。 尝试使用Sphinx,速度非常快,并且可以很好地与MySQL集成。

Sphinx website

答案 2 :(得分:1)

使用全文搜索而不是像

基于索引文本的全文搜索,比使用类似文本更快更好。

有关全文搜索的详细信息,请参阅此article

答案 3 :(得分:1)

我编写了一个接近Google操作的函数,考虑了要作为整个块搜索的元素的双引号。它没有考虑 - 或*指令。

表:要考虑的MySQL表

cols:要解析的列数组

searchParams:搜索进行处理。例如:红色野马“Florida 90210”

function naturalQueryConstructor($table, $cols, $searchParams) {

    // Basic processing and controls
    $searchParams = strip_tags($searchParams);
    if( (!$table) or (!is_array($cols)) or (!$searchParams) ) {
        return NULL;
    }
    // Start query
    $query = "SELECT * FROM $table WHERE ";

   // Explode search criteria taking into account the double quotes
    $searchParams = str_getcsv($searchParams, ' ');

   // Query writing
    foreach($searchParams as $param) {
      if(strpos($param, ' ') or (strlen($param)<4)) {
        // Elements with space were between double quotes and must be processed with LIKE.
        // Also for the elements with less than 4 characters. (red and "Florida 90210")
        $query .= "(";
        // Add each column
        foreach($cols as $col) {
            if($col) {
                $query .= $col." LIKE '%".$param."%' OR ";
            }
        }
        // Remove last ' OR ' sequence
        $query = substr($query, 0, strlen($query)-4);
        // Following criteria will added with an AND
        $query .= ") AND ";
      } else {
        // Other criteria processed with MATCH AGAINST (mustang)
        $query .= "(MATCH (";
        foreach($cols as $col) {
            if($col) {
                $query .= $col.",";
            }
        }
        // Remove the last ,
        $query = substr($query, 0, strlen($query)-1);
        // Following criteria will added with an AND
        $query .= ") AGAINST ('".$param."' IN NATURAL LANGUAGE MODE)) AND ";
      }
  }
  // Remove last ' AND ' sequence
  $query = substr($query, 0, strlen($query)-5);
  return $query;
}

感谢stackoverflow社区,我发现了这个功能的一部分!

答案 4 :(得分:0)

要像谷歌一样进行搜索,你需要许多数据库和索引节点,疯狂的算法......现在你想出了一个类似于SELECT ... ... lol:D

MySQL搜索速度慢,您需要正确设置全文和索引(MyISAM或Aria Engine)。要搜索的组合或不同实体几乎无法正确且快速地实现。

我建议设置一个基于Apache的Lucene的Elasticsearch服务器。 搜索速度非常快,易于维护。而且您不必关心SQL注入,并且仍然可以快速使用mysql服务器。

Elasticsearch(或其他基于Lucene的搜索引擎,如SolR)可以轻松安装在任何服务器上,因为它们是用Java编写的。

良好的文档:

http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/

答案 5 :(得分:-1)

我先做explode

$queryArray = explode(" ", $query);

然后生成SQL查询,例如:

for ($i=0; $i< count($queryArray); $i++) {
    $filter += " LIKE '%" + $queryArray[$i] + "%' AND" ;
}
$filter = rtrim ($filter, " AND");

$sql = "SELECT pageurl FROM ... WHERE name " + $filter

(注意:尚未测试/运行此代码)