4 回答

TA貢獻1884條經驗 獲得超4個贊
為什么您不使用 sql like 運算符,我為您提供了名為 products 的表中名為 Product 的列中的多個單詞的示例
$db=mysqli_connect('localhost','root','','project');
$search=$_GET['userinput'];
$searcharray = explode(' ', $search);
$searchpdo=array();
$finalstate="";
foreach ( $searcharray as $ind=> $query){
$sql=array();
$exp='%'.$query.'%';
array_push($sql,"(title LIKE ?)");
array_push($searchpdo,$exp);
array_push($sql,"(keywords LIKE ?)");
array_push($searchpdo,$exp);
if($finalstate==""){
$finalstate = "(".implode(" OR ",$sql).")";
}
else{
$finalstate = $finalstate." AND "."(".implode(" OR ",$sql).")";
}
}
$stmt = $db->prepare("SELECT * FROM products WHERE (".$finalstate.") ");
$types=str_repeat('s',count($searchpdo));
$stmt->bind_param($types,...$searchpdo);
$stmt->execute();
$result = $stmt->get_result();
這將為您提供單個單詞或多個單詞的正確結果

TA貢獻1831條經驗 獲得超9個贊
你的問題有多個方面
如果可用,請先使用 mysql 客戶端而不是 PHP 來運行查詢,直到您的查詢準備好達到您想要的效果
如果您最近的文檔(記錄)顯示在搜索結果的頂部,則需要更改您的
ORDER BY
條款。目前,它應該返回最接近的匹配(即 by?relevance
)。
您需要在自定義邏輯中在relevance
和recency
(不清楚如何定義)之間取得平衡。一個簡單的例子,將上周優(yōu)先于上個月,將上個月優(yōu)先于其余:
SELECT?
? ....
? , DATEDIFF (ItemDate, CURDATE() ) ItemAgeInDays
ORDER BY?
?relevance?
? ?* 100
? ?* CASE?
? ? ? ?WHEN ItemAgeInDays BETWEEN 0 AND 7 --- last week
? ? ? ?THEN 20
? ? ? ?WHEN ItemAgeInDays BETWEEN 0 AND 30 --- last month
? ? ? ?THEN 10
? ? ? ?ELSE 1
? ?END
?DESC
? ? 你說單個詞項無法搜索。在 中BOOLEAN MODE
,您為搜索構建布爾邏輯,并為此使用特殊字符。例如+apple
意味著“apple”必須存在。您的單個單詞可能與這些字符發(fā)生沖突。
? ? 您說查詢沒有返回正確的結果。FULL TEXT
搜索在每個文檔(行)中搜索您的登錄名,并查找它在每個文檔中出現的次數。然后,它會抵消您的搜索在所有文檔中出現的次數。這意味著它會優(yōu)先考慮 ? ? ?您的搜索出現次數遠高于平均水平的記錄。如果您的搜索區(qū)分度不夠,并且大多數文檔在該搜索方面與每個文檔相似,則可能看起來不正確。
? BOOLEAN MODE
默認情況下不對結果進行排序relevance
。您需要自己添加 ORDER BY,您已經這樣做了。只是想在這里為其他人指出

TA貢獻1789條經驗 獲得超10個贊
當在 WHERE 子句中使用 MATCH() 時,返回的行將自動按照相關性最高的排在最前面。
因此,您所要做的就是從 select 中刪除匹配項并將其放入 where 條件中。

TA貢獻1779條經驗 獲得超6個贊
我認為你必須稍微調整你的查詢,你會得到如下期望的結果:
$sql = mysql_query("SELECT * FROM patient_db WHERE MATCH ( Name, id_number ) AGAINST ('+firstWord +SecondWord +ThirdWord' IN BOOLEAN MODE);");
如果你想進行精確搜索:
$sql = mysql_query("SELECT * FROM patient_db WHERE MATCH ( Name, id_number ) AGAINST ('"Exact phrase/Words"' IN BOOLEAN MODE);");
我也在某個帖子中發(fā)布了相同的答案,但不知道該帖子
- 4 回答
- 0 關注
- 214 瀏覽
添加回答
舉報