我之前从未尝试过MYSQL,但我需要实现搜索.我有三个表,’articles’,’articles_tags’和’tags’.
“文章”包含了我想要搜索的第一件事,即“标题”字段.
‘articles_tags’是一个数据透视表,它将’articles’和’tags’关联在一起. ‘articles_tags’有两个字段:’articles_id’和’tag_id’.
‘tags’包含我要搜索的第二件事,即’name’字段.
我的问题是,我需要一种方法来搜索“标题”字段,以及与该文章相关的每个标记(“tags.name”)并返回文章的相关性(或按相关性排序).
实现这个的好方法是什么?我很确定它不能只从一个查询中完成,因此两个查询,然后将相关性“混合”在一起就可以了.
谢谢.
编辑:忘了说,如果我可以给匹配标签提供更多权重而不是匹配标题中的单词,那就太棒了.我并不是真的要求任何人写这个东西,而是给我一些方向.我在PHP和MySQL中都是一个新手.
解决方法:
从@ james.c.funk给出的答案开始,但做了一些更改.
SELECT a.id, a.title,
MATCH (a.title) AGAINST (?) AS relevance
FROM articles AS a
LEFT OUTER JOIN (articles_tags AS at
JOIN tags AS t ON (t.id = at.tag_id AND t.name = ?))
ON (a.id = at.article_id)
WHERE MATCH (a.title) AGAINST (? IN BOOLEAN MODE)
ORDER BY IF(t.name IS NOT NULL, 1.0, relevance) DESC;
我假设您希望标记匹配与完整字符串匹配,而不是使用全文搜索.
还使用一个左外连接而不是两个,因为如果满足articles_tags的连接,那么肯定有一个标签.将标记名称比较放在连接条件内而不是WHERE子句中.
布尔模式使得MATCH()在匹配时返回1.0,这使得它无法用作相关性的度量.因此,在选择列表中进行额外比较以计算相关性.该值介于0.0和1.0之间.现在我们可以通过将其标记为1.0的相关性来使标记匹配排序更高.
标签:mysql,search,tags,full-text-search
来源: https://codeday.me/bug/20190522/1151651.html