如何使用 PHP 使全文搜索更准确

我正在为我的项目实现搜索功能。我正在使用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的建议。


qq_花开花谢_0
浏览 105回答 4
4回答

慕村9548890

为什么您不使用 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();这将为您提供单个单词或多个单词的正确结果

天涯尽头无女友

你的问题有多个方面如果可用,请先使用 mysql 客户端而不是 PHP 来运行查询,直到您的查询准备好达到您想要的效果如果您最近的文档(记录)显示在搜索结果的顶部,则需要更改您的ORDER BY条款。目前,它应该返回最接近的匹配(即 by relevance)。您需要在自定义逻辑中在relevance和recency(不清楚如何定义)之间取得平衡。一个简单的例子,将上周优先于上个月,将上个月优先于其余:SELECT   ....  , DATEDIFF (ItemDate, CURDATE() ) ItemAgeInDaysORDER 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”必须存在。您的单个单词可能与这些字符发生冲突。    您说查询没有返回正确的结果。FULL TEXT搜索在每个文档(行)中搜索您的登录名,并查找它在每个文档中出现的次数。然后,它会抵消您的搜索在所有文档中出现的次数。这意味着它会优先考虑      您的搜索出现次数远高于平均水平的记录。如果您的搜索区分度不够,并且大多数文档在该搜索方面与每个文档相似,则可能看起来不正确。  BOOLEAN MODE默认情况下不对结果进行排序relevance。您需要自己添加 ORDER BY,您已经这样做了。只是想在这里为其他人指出

至尊宝的传说

当在 WHERE 子句中使用 MATCH() 时,返回的行将自动按照相关性最高的排在最前面。因此,您所要做的就是从 select 中删除匹配项并将其放入 where 条件中。

哆啦的时光机

我认为你必须稍微调整你的查询,你会得到如下期望的结果:$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);");我也在某个帖子中发布了相同的答案,但不知道该帖子
打开App,查看更多内容
随时随地看视频慕课网APP