[英]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创建全文搜索以准备语句,并先按相关性然后按年份返回结果。
因此,如果针对“ 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);
这仅按年份返回它们-所有文本相关性都丢失了吗?
我看到了其他一些非常复杂的示例,这些示例对我来说很难理解-而且它们不包含任何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
请注意,我实际搜索的电影是最后一部,而“无处女”则是第一部,因为这是最近一部。
您似乎在这里有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";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.