[英]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.