MYSQL全文搜索按相关性排序

9

我尝试使全文搜索按相关度排序。 这是我的代码。如果删除 ORDER BY 就可以工作,但不会按相关度排序。 我已经尝试了这个,但实际上它使得无法找到任何结果...有什么想法吗?

$query_for_result=mysql_query("
     SELECT * FROM Assets WHERE MATCH 
    (`Badge`,`First Name`,`Last Name`,`Service Tag`,`Asset Tag`)
     AGAINST ('".$query."*' IN BOOLEAN MODE) and
   `deleted` = '0'  ORDER BY relevance DESC");

编辑*

<input type="text" name="query" />
<input type="hidden" value="Search" name="submit" />
<input type="submit" name="submit" value="Search" />

</form>
<h4>Search by: Badge, First or Last Name, Service Tag, Asset Tag, Printer Queue or Printer IP.</h4>
<br>
</center>

<?php


if(isset($_GET['submit'])){


$db_tb_name=Assets;
$db_tb_atr_name=`First Name`;

$query=mysql_real_escape_string($_GET['query']);

$query_for_result=mysql_query("
 SELECT * FROM Assets WHERE MATCH 
(`Badge`,`First Name`,`Last Name`,`Service Tag`,`Asset Tag`)
 AGAINST ('".$query."*' IN BOOLEAN MODE) and
`deleted` = '0'  ORDER BY relevance DESC");

然后在代码的后面
while($data_fetch=mysql_fetch_array($query_for_result))
{

print '<h3>';   
print "<a href=\"modify.php?id=" . $data_fetch['id'] . "\">" . $data_fetch['First Name']  . ' ' . $data_fetch['Last Name'] . "</a>";
print '<br/><b>Badge:</b> '. $data_fetch['Badge'];
print '<br/> <b>Service Tag:</b> '. $data_fetch['Service Tag'];
print ' <b>Asset Tag:</b> '. $data_fetch['Asset Tag'];
print '<br/> <b>Status:</b> '. $data_fetch['Status'];
print '<br/><b>Employee Status: </b>';
    if( $data_fetch['Employee Status'] == 'Active' ){
print '<font color="#32CD32">' . $data_fetch['Employee Status'] . '</font>';
    }
elseif( $data_fetch['Employee Status'] == 'Terminated' ){
print '<font color="red">' . $data_fetch['Employee Status'] . '</font>';}
print '<br/> <b>Last Modified:</b> '. $data_fetch['Last Modified'];
print "<span> </span>";
print '</h3>';
print '<br/><p>' ; 

}

更新 这个方法对我有用 最终我通过使用以下方法使其工作

$query_for_result=mysql_query("SELECT  *, MATCH 
(`Badge`,`First Name`,`Last     Name`,`Service Tag`,`Asset Tag`) 
AGAINST ('".$query."'IN BOOLEAN MODE) AS Relevance FROM Assets WHERE 1 AND MATCH 
(`Badge`,`First Name`,`Last Name`,`Service Tag`,`Asset Tag`)
AGAINST ('".$query."' IN BOOLEAN MODE) and
 `deleted` = '0' ORDER BY Relevance DESC "); 
1个回答

10

来自MySQL布尔全文搜索文档

它们不会自动按相关性降序排序行。您可以从前面的查询结果中看到这一点:具有最高相关性的行是包含“MySQL”两次的行,但它排在最后,而不是第一。

这就解释了为什么没有使用ORDER BY进行相关性排序。现在要能够按相关性排序,您需要定义它:

SELECT *, MATCH (`Badge`,`First Name`,`Last Name`,`Service Tag`,`Asset Tag`) as relevance
WHERE MATCH AGAINST ('".$query."' IN BOOLEAN MODE) and `deleted` = '0'
ORDER BY relevance DESC

谢谢,但出于某种原因,这仍然导致未找到任何行。 - user1548769
@user1548769 你能分享一下返回无结果的查询吗? - Tchoupi
@user1548769 你的代码其他部分看起来都没问题。在 mysql_query 之前,你能否使用 echo 输出一下发送给 MySQL 的查询语句? - Tchoupi
2
我最终通过使用以下代码使其工作:`$query_for_result=mysql_query("SELECT *, MATCH (`Badge`,`First Name`,`Last Name`,`Service Tag`,`Asset Tag`) AGAINST ('".$query."'IN BOOLEAN MODE) AS Relevance FROM Assets WHERE 1 AND MATCH (`Badge`,`First Name`,`Last Name`,`Service Tag`,`Asset Tag`) AGAINST ('".$query."' IN BOOLEAN MODE) and `deleted` = '0' ORDER BY Relevance DESC ");`感谢您的帮助。 - user1548769
永远不要在完整文本索引上使用过滤器,也不要在完整文本上使用。 - alter123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接