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

问题描述 投票:0回答:4

我正在为我的项目实现搜索功能。我正在使用

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)。

php sql search full-text-search search-engine
4个回答
1
投票

当在 WHERE 子句中使用 MATCH() 时,返回的行将自动按照相关性最高的排在最前面。
因此,您所要做的就是从 select 中删除匹配项并将其放入 where 条件中。
来源:https://dev.mysql.com/doc/refman/8.0/en/fulltext-natural-language.html


1
投票

为什么您不使用 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();

这将为您提供单个单词或多个单词的正确结果


1
投票

我认为你必须稍微调整你的查询,你会得到如下所需的结果:

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

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


1
投票

您的问题有多个方面

  1. 如果可用,请先使用 mysql 客户端而不是 PHP 来运行查询,直到您的查询准备好达到您想要的效果

  2. 如果您最近的文档(记录)显示在搜索结果的顶部,则需要更改您的

    ORDER BY
    子句。目前,它应该返回最接近的匹配(即通过
    relevance
    )。

您需要在自定义逻辑中在

relevance
recency
(不清楚如何定义)之间取得平衡。一个简单的例子,将上周优先于上个月,将上个月优先于其余:

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
  1. 您说无法搜索单个词项。在
    BOOLEAN MODE
    中,您为搜索构建布尔逻辑,并为此使用特殊字符。例如
    +apple
    表示“苹果”必须存在。您的单个单词可能与这些字符发生冲突。

请查看此参考资料,它详细解释了

BOOLEAN MODE

https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html

  1. 您说查询没有返回正确的结果。

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

  2. 默认情况下,
  3. BOOLEAN MODE
    不会按
    relevance
    对结果进行排序。您需要自己添加 ORDER BY,您已经这样做了。只是想在这里为其他人记下

© www.soinside.com 2019 - 2024. All rights reserved.