繁体   English   中英

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创建全文搜索以准备语句,并先按相关性然后按年份返回结果。

因此,如果针对“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM