排序与mysql的相关性匹配2个表中的多个单词

时间:2013-06-22 08:54:28

标签: mysql match

上午,

我在网站上有一个搜索栏,我正在对2个表和4列的单词进行通配符搜索。我想做一个多字搜索,所以我把编码交换到了match..against语句。

我遇到的问题是订购相关性。目前,如果我搜索3个单词,我希望它首先显示带有这3个单词的产品,但它似乎优先显示第3个单词,优先于第2个单词,然后是第3个单词。不确定这是否是由于如此广泛的搜索(按列)或是否需要关联每列的相关性。

我添加了布尔模式,并在搜索字符串中使用大于号更改了空格以尝试添加优先级..

我正在使用PDO准备好的声明以获得最大的安全性。(我希望)

我目前的代码..

$search = filter_var($_GET['s'], FILTER_SANITIZE_STRING);
$searchfor = str_replace(' ',' >',$searchfor);
$itemResults = $conn->prepare("SELECT a.*
                            FROM item_info_short a 
                            LEFT JOIN item_information b 
                            ON a.id = b.id  
                            WHERE MATCH(a.title,a.manufacturer,a.item_code,a.colour,b.shortdescription) 
                            AGAINST(:searchfor IN BOOLEAN MODE)     
                            LIMIT $offset,$itemsperpage");

    $itemResults->bindValue(':searchfor',$searchfor,PDO::PARAM_STR);
    $itemResults->execute();

非常感谢您的帮助。 肯尼

1 个答案:

答案 0 :(得分:1)

通常,您总是需要ORDER BY来确保某种顺序,但MySQL为自然语言匹配添加了一些魔力,这会导致行始终按相关性排序。不幸的是,这不适用于布尔搜索。

http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html说:

布尔全文搜索具有以下特征:

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

因此,您可以进行自然语言搜索,或使用其他搜索按以下顺序对结果进行排序,而不是使用布尔搜索:

SELECT a.*
FROM item_info_short a 
LEFT JOIN item_information b ON a.id = b.id  
WHERE 
  MATCH(a.title,a.manufacturer,a.item_code,a.colour,b.shortdescription) 
    AGAINST(:searchfor IN BOOLEAN MODE)     
ORDER BY 
  MATCH(a.title,a.manufacturer,a.item_code,a.colour,b.shortdescription) 
    AGAINST(:searchfor IN NATURAL LANGUAGE MODE) DESC    
LIMIT $offset,$itemsperpage");

或者,可能更好/更快:

SELECT a.*
FROM item_info_short a 
LEFT JOIN item_information b ON a.id = b.id  
WHERE 
  MATCH(a.title,a.manufacturer,a.item_code,a.colour,b.shortdescription) 
    AGAINST(:searchfor IN NATURAL LANGUAGE MODE) DESC    
LIMIT $offset,$itemsperpage");