【问题标题】:Multi word search in PHP/MySQLPHP/MySQL 中的多词搜索
【发布时间】:2012-01-18 22:48:22
【问题描述】:

我正在努力创建一个搜索多个单词的搜索。我的第一次尝试没有任何结果,如下:

  require_once('database_conn.php');
  if($_POST){
  $explodedSearch = explode (" ", $_POST['quickSearch']);


  foreach($explodedSearch as $search){
  $query = "SELECT * 
            FROM jobseeker 
            WHERE forename like '%$search%' or surname like '%$search%' 
            ORDER BY userID 
            LIMIT 5";
  $result = mysql_query($query);
}

while($userData=mysql_fetch_array($result)){
    $forename=$userData['forename'];
    $surname=$userData['surname'];
    $profPic=$userData['profilePicture'];
    $location=$userData['location'];

    echo "<div class=\"result\">
    <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/>
    <p class=\"quickName\">" . $forename . " " . $surname . "</p>
    <p class=\"quickLocation\"> " . $location . "</p>
    </div>";

}
}  

我还尝试了以下方法,产生了结果,但您可以想象,我输入的每个单词都会得到重复的结果:

if($_POST){
$explodedSearch = explode (" ", $_POST['quickSearch']);


foreach($explodedSearch as $search){
$query = "SELECT * 
          FROM jobseeker 
          WHERE forename like '%$search%' or surname like '%$search%' 
          ORDER BY userID 
          LIMIT 5";
$result .= mysql_query($query);


while($userData=mysql_fetch_array($result)){
    $forename=$userData['forename'];
    $surname=$userData['surname'];
    $profPic=$userData['profilePicture'];
    $location=$userData['location'];

    echo "<div class=\"result\">
    <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/>
    <p class=\"quickName\">" . $forename . " " . $surname . "</p>
    <p class=\"quickLocation\"> " . $location . "</p>
    </div>";
}
}
}

我不知道如何进行此操作,任何帮助将不胜感激。

编辑:

if($_POST){
$quickSearch = $_POST['quickSearch'];
$explodedSearch = explode (" ", trim($quickSearch));


$queryArray = array();

foreach($explodedSearch as $search){
$term = mysql_real_escape_string($search);
$queryArray[] = "forename like '%" . $term .  "%' surname like '%" . $term . "%'";
}

$implodedSearch = implode(' or ', $queryArray);

$query="SELECT *
        FROM jobseeker
        WHERE ($implodedSearch)
        ORDER BY userID
        LIMIT 5";

$result = mysql_query($query);

while($userData=mysql_fetch_array($result, MYSQL_ASSOC)){
    $forename=$userData['forename'];
    $surname=$userData['surname'];
    $profPic=$userData['profilePicture'];
    $location=$userData['location'];


    echo "<div class=\"result\">
    <img class=\"quickImage\" src=\"" . $profPic. "\" width=\"45\" height=\"45\"/>
    <p class=\"quickName\">" . $forename . " " . $surname . "</p>
    <p class=\"quickLocation\"> " . $location . "</p>
    </div>";

}
}

【问题讨论】:

    标签: php mysql search foreach explode


    【解决方案1】:

    我一直在研究同一主题(使用关键字搜索),这就是我的做法:

    $words = $_POST['keywords'];
    if(empty($words)){
        //redirect somewhere else!
    }
    $parts = explode(" ",trim($words));
    $clauses=array();
    foreach ($parts as $part){
        //function_description in my case ,  replace it with whatever u want in ur table
        $clauses[]="function_description LIKE '%" . mysql_real_escape_string($part) . "%'";
    }
    $clause=implode(' OR ' ,$clauses);
    //select your condition and add "AND ($clauses)" .
    $sql="SELECT * 
          FROM functions 
          WHERE
          user_name='{$user_name}'
          AND ($clause) ";
    $results=mysql_query($sql,$connection);
     if(!$results){
        redirect("errors/error_db.html");
     }
     else if($results){
     $rows = array();
    <?php 
     while($rows = mysql_fetch_array($results, MYSQL_ASSOC))
    {
       // echo whatever u want !
    }
    ?>
    

    -- 现在这是我尝试使用 FULLTEXT 搜索运行它时的样子: 但是您应该将表类型设置为“MyISAM”

    <?php
    $words = mysql_real_escape_string($_POST['function_keywords']);
    if(empty($words)){
        redirect("welcome.php?error=search_empty");
    }
    //if the columns(results)>1/2(columns) => it will return nothing!(use "NATURAL LANGUAGE"="BOOLEAN")
    $sql="SELECT * FROM functions
         WHERE MATCH (function_description)
         AGAINST ('{$words}' IN NATURAL LANGUAGE MODE)";
    $results=mysql_query($sql,$connection);
     if(!$results){
        redirect("errors/error_db.html");
     }
     else if($results){
    $rows = array();
    while($rows = mysql_fetch_array($results, MYSQL_ASSOC))
    {
         // echo 
    }
    }
    ?>
    

    【讨论】:

    • 使用LIKE '%x%',不使用索引,你知道的。
    • 使用索引有什么区别?
    • 您的搜索在大表上会很慢。阅读此en.wikipedia.org/wiki/Index_%28database%29
    • 我应该用全文搜索替换这个方法吗?
    • 您好,感谢您的提醒,您的回答似乎与我目前工作的水平最相似。唯一的问题是我收到以下错误:警告:mysql_fetch_array():提供的参数不是有效的 MySQL 结果资源我不知道为什么
    【解决方案2】:

    这就是我所做的

    if (isset($_POST['search'])){
    $words = mysql_real_escape_string($_POST['searchfield']);   
    $arraySearch = explode(" ", trim($words));       
    $countSearch = count($arraySearch);
    $a = 0;
    $query = "SELECT * FROM parts WHERE ";
    $quote = "'";
    while ($a < $countSearch)
    {
      $query = $query."description LIKE $quote%$arraySearch[$a]%$quote ";
      $a++;
      if ($a < $countSearch)
      {
        $query = $query." AND ";
        }   
      }
        $result=mysql_query($query) or die(error);
    

    //你可以把它留在这里,简短而甜蜜,但我添加了一些额外的代码,如果它没有出现任何结果,那么它会搜索任何一个词而不是两个词//

    $num = mysql_num_rows($result);
    if ($num == 0){
     $a = 0;
     $query = "SELECT * FROM parts WHERE ";
    while ($a < $countSearch)
    {
      $query = $query."description LIKE $quote%$arraySearch[$a]%$quote ";
      $a++;
      if ($a < $countSearch)
      {
        $query = $query." OR ";
        $msg = "No exact match for: $words. Maybe this is what you're looking for though? If not please try again.";
        }
    
      }
      }
      $result=mysql_query($query) or die($query);
      if (mysql_num_rows($result) == 0){
        $msg = "No results, please try another search";
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      也许您正在寻找的是MySQL full-text search

      对于您的示例,您可以执行以下操作:

      if ($_SERVER['REQUEST_METHOD'] == 'POST') {
          $search = $_POST['quickSearch'];
          // Todo: escape $search
          $sql = "
              SELECT
                  *,
                  MATCH (`forename`)
                  AGAINST ('{$search}' IN NATURAL LANGUAGE MODE) AS `score`
              FROM `jobseeker`
              WHERE
                  MATCH (`forename`)
                  AGAINST ('{$search}' IN NATURAL LANGUAGE MODE)";
          // Todo: execute query and gather results
      }
      

      请注意,您需要将FULLTEXT 索引添加到forename 列。

      【讨论】:

      • 我很难理解这种做事方式?我是否必须为每一列构建一个查询?
      • @Richie,(或任何 4 年后阅读本文的人!)不,您可以指定多个列 docsMATCH (col1,col2,...) AGAINST (expr [search_modifier])
      【解决方案4】:

      如果您必须使用 MySQL,请查看 MySQL fulltext searches。否则看看SOLR,这是一个全文搜索引擎。您可以结合使用 MySQL 和 SOLR,为您的应用提供企业级搜索功能。

      【讨论】:

      • SOLR 非常有趣,但远远超出了我目前正在研究的范围,即作为大学团队项目构建的社交网络的搜索和消息传递功能。但是,我会将您提供的链接添加为书签,并为将来的项目阅读它。非常感谢。
      • @RichieVikinglordTerry:没问题。你肯定想看看 MySQL 的全文搜索。请注意,如果您实现fulltext,它只能在 MyISAM 表上完成(与 InnoDB 相比)。
      猜你喜欢
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      相关资源
      最近更新 更多