MySQL 使用 PHP 和 PDO 按相关性和整数进行全文搜索、连接和排序

MySQL full text search, joining and ordering both by relevancy and an integer, using PHP and PDO

我有两个表:

现在我想使用 PHP 和 PDO 创建全文搜索来准备语句和 return 结果,首先按相关性,然后按年份。

因此,如果搜索 'test':

test, 2
test, 1
testy test, 1
test me, 1
lets test, 1

我希望 'test, 2' 首先显示,然后是第二个测试,然后是根据认为相关的全文进行最相关的搜索?上面的顺序是一个好的开始。

这是我到目前为止创建的

$query = "SELECT Meta.id, Meta.year, Posters.filename, Meta.title,
              FROM Meta INNER JOIN Posters ON Meta.id = Posters.movie_id
              WHERE MATCH(Meta.title)
              AGAINST(:term IN BOOLEAN MODE)
              ORDER BY Meta.year DESC
              LIMIT 50";
    $statement = $this->db->prepare($query);
    $statement->bindValue(':term', $term);
    $statement->execute();
    return $statement->fetchAll(PDO::FETCH_ASSOC);

这 return 仅按年份 - 所有文本相关性都丢失了吗?

我见过其他非常复杂的示例,这些示例对我来说很难理解 - 而且它们不包含任何 JOIN,这让我更难理解。

理想情况下,我想要一个查询。

编辑:为了澄清,当我搜索时

the girl with the dragon tattoo

结果是

nowhere girl
how to train your dragon 2
how to train your dragon
gone girl
(several movies with 'girl' keyword in them)
The girl with the dragon tattoo

注意我实际搜索的电影是最后一个,"nowhere girl" 是第一个,因为它是最新的。

您这里似乎有 2 个问题。首先,如果您匹配 IN BOOLEAN MODE,您将始终获得 1.0.

的相关性

接下来,您没有任何相关性,因为您没有使用它。您需要使用类似以下内容将其添加到您的查询中:

$query = "SELECT Meta.id, Meta.year, Posters.filename, Meta.title,
              MATCH(Meta.title) AGAINST(:term) AS Relevance
              FROM Meta INNER JOIN Posters ON Meta.id = Posters.movie_id
              WHERE MATCH(Meta.title)
              AGAINST(:term IN BOOLEAN MODE)
              ORDER BY Relevance DESC, Meta.year DESC
              LIMIT 50";