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

csga3l58  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(428)

我正在为我的项目实现一个搜索功能。我用的是 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(例如keyword=google)时,这个查询不能正常工作。
请不要对这些问题提出建议 Elastic search , Sphinx , Algolia 等。

whlutmcx

whlutmcx1#

当在where子句中使用match()时,返回的行将首先以最高相关性自动排序。
因此,您所要做的就是,从select中删除匹配项并将其置于where条件中。
资料来源:https://dev.mysql.com/doc/refman/8.0/en/fulltext-natural-language.html

doinxwow

doinxwow2#

为什么不使用sql-like运算符,我将为您提供一个示例,说明namedproducts表中namedproduct列中的多个单词

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

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

xu3bshqb

xu3bshqb3#

我认为您必须稍微调整一下您的查询,您将得到所需的结果,如下所示:

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

我也把同样的答案贴在某处的某个帖子里,但我不知道这个帖子

y1aodyip

y1aodyip4#

你的问题有很多方面
如果有的话,可以先使用mysql客户机来运行查询,而不是php,直到您的查询准备好了
如果要在搜索结果顶部显示最近的文档(记录),则需要更改 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

你说不能搜索单个单词项。在 BOOLEAN MODE ,您为您的搜索构建了一个布尔逻辑,因此它使用特殊字符进行搜索。例如 +apple 意思是“苹果”必须存在。您的单个单词可能与这些字符冲突。
请查看此参考资料,它解释了 BOOLEAN MODE 非常详细。
https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html
您说查询没有返回正确的结果。 FULL TEXT 搜索在每个文档(行)中搜索您的登录并查找它在每个文档中出现的次数。然后用搜索在所有文档中出现的次数来抵消。这意味着它会优先处理那些你的搜索结果远远超过平均水平的记录。如果您的搜索没有足够的区分,那么如果大多数文档在搜索方面彼此相似,则可能看起来不正确。有关更多详细信息,请参阅上面的链接。 BOOLEAN MODE 不按排序结果 relevance 默认情况下。你需要自己添加订单,你已经添加了。只是想在这里给别人记下

相关问题