簡體   English   中英

多關鍵詞搜索

[英]Multiple keywords search

我在我的網站中添加搜索時遇到問題。 我想不出完成它的方法。

我有一個表如下:

TABLE A

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

現在我想使用關鍵字= hello代碼進行搜索

結果應該為我提供這兩行,因為這兩行都包含關鍵字的某些部分,如下所示:

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();

$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 中的全文搜索

您可以使用以下代碼:

<?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);


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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM