MySQL 使用 PHP 和 PDO 按相关性和整数进行全文搜索、连接和排序
MySQL full text search, joining and ordering both by relevancy and an integer, using PHP and PDO
我有两个表:
Meta
拥有关于 ID 的所有信息。
Posters
通过 movie_id 与 Meta 存在多对一关系(有时一部电影有很多海报)
现在我想使用 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";
我有两个表:
Meta
拥有关于 ID 的所有信息。Posters
通过 movie_id 与 Meta 存在多对一关系(有时一部电影有很多海报)
现在我想使用 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";