2

早晨,

我在一个网站上有一个搜索栏,我正在对 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();

非常感谢您的帮助。肯尼

4

1 回答 1

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");
于 2013-06-22T11:18:53.817 回答