Php 像谷歌这样的数据库搜索

Php 像谷歌这样的数据库搜索,php,mysql,sql,database,search,Php,Mysql,Sql,Database,Search,我目前在我的PHP+MYSQL网站上有一个搜索选项 MYSQL查询当前类似于“SELECT pageurl,其中名称类似“%$query%” 我在这里发布的原因是因为我注意到,如果我的一款产品的名称是“蓝色自行车”,而有人在寻找“蓝色自行车”,则不会返回任何结果 我正在寻找一个解决方案,因为我知道如果我在谷歌上键入相同的单词,就会出现一些东西 我想创建一个PHP函数,如果查询包含4个或更少的单词,那么它可以混合查询中的所有单词,生成大约24个查询 有更简单的解决办法吗 谢谢你的时间我会先做一个分

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

MYSQL查询当前类似于“SELECT pageurl,其中名称类似“%$query%”

我在这里发布的原因是因为我注意到,如果我的一款产品的名称是“蓝色自行车”,而有人在寻找“蓝色自行车”,则不会返回任何结果

我正在寻找一个解决方案,因为我知道如果我在谷歌上键入相同的单词,就会出现一些东西

我想创建一个PHP函数,如果查询包含4个或更少的单词,那么它可以混合查询中的所有单词,生成大约24个查询

有更简单的解决办法吗


谢谢你的时间

我会先做一个
分解

$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
for($i=0;$i

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

使用全文搜索而不是类似搜索

基于索引文本的全文搜索,比使用like更快、更好


有关全文搜索的更多信息,请参见此

,以免在没有有效答案的情况下放弃:

<?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\uu

继续使用
mysqli\u real\u escape\u字符串
或使用
$mysqli->real\u escape\u字符串($searchTerm)

mysql\uz

如果您使用的是
mysql\u
,那么您应该使用
mysql\u real\u escape\u string($searchTerm)
(并考虑在不推荐使用时进行更改)

PDO


如果你使用PDO,你应该使用
trim($PDO->quote($searchTerm),“'”)

来进行类似谷歌的搜索,你需要很多数据库和索引节点,疯狂的算法……现在你可以选择像……lol:d

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

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

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

良好的文件:


您要查找的是全文搜索。 试试Sphinx,它速度非常快,并且与MySQL集成得很好


我编写了一个函数,该函数接近谷歌的操作,考虑了作为一个整体块搜索的元素的双引号。它不考虑-或*指令

表:要考虑的MySQL表

cols:要分析的列的数组

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

函数naturalQueryConstructor($table、$cols、$searchParams){
//基本处理和控制
$searchParams=带标签($searchParams);
如果(!$table)或(!is_数组($cols))或(!$searchParams)){
返回NULL;
}
//开始查询
$query=“从$table WHERE中选择*”;
//考虑双引号的分解搜索条件
$searchParams=str_getcsv($searchParams,”);
//查询写入
foreach($searchParams作为$param){

if(strpos($param,'')或(strlen($param)把它按单词分开怎么样?
这里的名字像“%$word1%”和名字像“%$word2%”等等?我想你的建议可能让trickRemember对输入进行了清理,如果你不使用prepared语句,你说得有道理,但我只是想粗略地表达一下这个想法。无论如何,@H2Ooooo已经是了评论中提到,由于某人的要求或缺乏知识而开玩笑并不能使你成为一个更聪明或更好的人。搜索的每一列都必须是“全文”,每一列都必须是“全文”"另一个要点:匹配对“全”字的请求,这意味着“MuSa”不会帮助找到“Muthang'”。所以我删除了我的查询构建的第二部分……这是用PHP吗?我下载了它,但是它看起来像是基于C++。如果它使用PHP,那么拇指up@JohnMaxSphinx是独立的服务器软件,它实现了MySQL协议col用于集成,因此您可以使用任何支持连接到MySQL服务器的客户端。
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;
}