多个关键字搜索

时间:2014-10-12 06:35:14

标签: php mysql

我在网站上添加搜索时遇到了麻烦。我无法弄清楚如何完成它。

我的表格如下:

TABLE A

id     text
1       Hello there whats up. I'm trying to code.
2       there need to be this code

现在我想使用 关键字 = 您好 代码

结果应该为我提供两行,因为这两行都包含关键字的一部分,如下所示:

id      text
1       **Hello** there whats up. I'm trying to **code**
2       there need to be this **code**

此外,结果应该为行提供最先匹配的最大关键字数。

我试过这样做,但它只为我提供了一些我渴望的结果。

<?php
   $keyword = 'hello code';
   $exloded = explode(' ', $keyword);
   foreach($exploded as value):
      $sth = $db->query("SELECT * FROM A WHERE `text` LIKE :value");
      $sth->execute(array(':value' => '%'.$value.'%'));
      $rows = $sth->fetchAll();
   endforeach;

   echo $rows;
?>

更新

我只是做了这个,它对我来说很好。但我想知道这是否是完成工作的正确方法。

$keyword = hello code;
$query ="SELECT *, MATCH(`page_content`) AGAINST('$keyword' IN BOOLEAN MODE) AS score      FROM super_pages WHERE MATCH(`page_content`) AGAINST('$keyword' IN BOOLEAN     MODE) ORDER BY score DESC";
$sth = $this->db->query($query);
$result = $sth->fetchAll();

2 个答案:

答案 0 :(得分:1)

$rows会在您的表格中显示关键字code匹配的数据,您可以重写代码以匹配两个关键字

$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$query = 'SELECT * FROM A ';
$i = 0;
$params = array();
foreach ($exploded as $value):
    if ($i == 0) {
        $query .= ' WHERE `text` LIKE :value_'.$i;
    } else {
        $query .= ' OR `text` LIKE :value_'.$i;
    }
    $params[':value_'.$i] = '%'.$value .'%';
    $i++;
endforeach;
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';

循环构建查询(通过提供的关键字)并在查询中指定唯一占位符以匹配所有值

编辑全文搜索

使用全文搜索,您可以使用提供的关键字匹配完全相同的词组。要使用全文搜索,您需要类型为FULLTEXT的索引。

ALTER TABLE `A` ADD FULLTEXT INDEX `fulltextindex` (`text`); 

查询就像

$keyword = 'hello code';
$exloded = explode(' ', $keyword);
$where = '';
$i = 0;
$select = array();
$params = array();

foreach ($exploded as $value):
    $select[]= ' MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE) ';
    if ($i == 0) {
        $where  .= ' WHERE MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
    } else {
        $where  .= ' OR MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
    }
    $params[':value_'.$i] =  $value ;
    $i++;
endforeach;

$query ='SELECT *,'. implode( ' + ',$select).' AS score FROM A '.$where.' ORDER BY score DESC';
$sth = $db->query($query);
$sth->execute($params);
$rows = $sth->fetchAll();
echo '<pre>';print_r($rows);echo '</pre>';

以上代码将生成类似

的查询
SELECT *,
MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
+ 
MATCH(`text`) AGAINST('code' IN BOOLEAN MODE) AS score
FROM A 
WHERE MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
OR  MATCH(`text`) AGAINST('code' IN BOOLEAN MODE)
ORDER BY score DESC

上述查询中的别名score将为每一行及其匹配的分数赋值,因此您可以按降序排序结果,以便首先显示分数最高的记录。

  

注意:您可以在Myisam中使用全文搜索,但对于innodb,您可以使用   将Mysql升级到5.6,支持全文搜索   innodb也是

答案 1 :(得分:0)

您可以使用以下代码:

<?php
   $keyword = 'hello code';
   $exloded = explode(' ', $keyword);

   $sql = "SELECT * FROM A WHERE ";


   foreach($exploded as $value):
      $sql .= "text LIKE '" . $value "%' OR ";
   endforeach;

   // remove last 'OR '
   $sql = substr($sql, -3);

   $result = mysqli_query($con, $sql);


   //................
 ?>