mysql中布尔搜索_MySQL带标签的全文布尔搜索

我之前从未尝试过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值