第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 PHP 使全文搜索更準確

如何使用 PHP 使全文搜索更準確

PHP
qq_花開花謝_0 2023-08-19 10:29:49
我正在為我的項目實現搜索功能。我正在使用FULL TEXT SEARCH查詢來獲取準確的結果User。我是編程初學者PHP,我沒有足夠的信息FULL TEXT SEARCH。這是我的查詢:$sql = $conn->prepare("SELECT *, MATCH(title, keyword) AGAINST(? IN BOOLEAN MODE) AS relevance FROM table ORDER BY relevance DESC LIMIT 20");$sql->bind_param("s", $q);$sql->execute();$rs = $sql->get_result();這個查詢效果很好,但是這只是首先顯示舊的結果而不是準確的結果,第二件事是當關鍵字的長度不超過 1 時(例如關鍵字= Google),這個查詢無法正常工作。請不要給出有關Elastic search、Sphinx等 Algolia的建議。
查看完整描述

4 回答

?
慕村9548890

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

這將為您提供單個單詞或多個單詞的正確結果


查看完整回答
反對 回復 2023-08-19
?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

你的問題有多個方面

  1. 如果可用,請先使用 mysql 客戶端而不是 PHP 來運行查詢,直到您的查詢準備好達到您想要的效果

  2. 如果您最近的文檔(記錄)顯示在搜索結果的頂部,則需要更改您的ORDER BY條款。目前,它應該返回最接近的匹配(即 by?relevance)。

您需要在自定義邏輯中在relevancerecency(不清楚如何定義)之間取得平衡。一個簡單的例子,將上周優(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,您已經這樣做了。只是想在這里為其他人指出


查看完整回答
反對 回復 2023-08-19
?
至尊寶的傳說

TA貢獻1789條經驗 獲得超10個贊

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

查看完整回答
反對 回復 2023-08-19
?
哆啦的時光機

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ā)布了相同的答案,但不知道該帖子


查看完整回答
反對 回復 2023-08-19
  • 4 回答
  • 0 關注
  • 214 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號