为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 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(不清楚如何定义)之间取得平衡。一个简单的例子,将上周优先于上个月,将上个月优先于其余:

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”必须存在。您的单个单词可能与这些字符发生冲突。

    您说查询没有返回正确的结果。FULL TEXT搜索在每个文档(行)中搜索您的登录名,并查找它在每个文档中出现的次数。然后,它会抵消您的搜索在所有文档中出现的次数。这意味着它会优先考虑      您的搜索出现次数远高于平均水平的记录。如果您的搜索区分度不够,并且大多数文档在该搜索方面与每个文档相似,则可能看起来不正确。

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

我也在某个帖子中发布了相同的答案,但不知道该帖子


查看完整回答
反对 回复 2023-08-19
  • 4 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信