为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL match()对()-按相关性和按列排序?

MySQL match()对()-按相关性和按列排序?

拉莫斯之舞 2019-10-15 14:59:20
好的,所以我试图在多列中进行全文搜索,就像这样简单:SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)现在,我想按相关性排序(找到了多少个单词?),我已经可以使用以下方式进行处理:SELECT * , MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE) AS relevance FROM pagesWHERE MATCH (head, body) AGAINST ('some words' IN BOOLEAN MODE)ORDER BY relevance现在这是我迷路的部分,我想在此head列中优先考虑相关性。我想我可以创建两个相关性列,一个用于head,一个用于body,但是到那时,我将在表中进行三遍相同的搜索,而对于我要创建的函数,性能非常重要,因为查询将被联接并与其他表匹配。因此,我的主要问题是,是否有更快的方法来搜索相关性并确定某些列的优先级?(作为奖励,甚至可能使相关性计数单词在列中出现的次数?)任何建议或意见将是巨大的。注意:我将在LAMP服务器上运行它。(本地测试中的WAMP)
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

这可能会增加与所需头部的相关性。它不会使它加倍,但它可能对您而言足够好:


SELECT pages.*,

       MATCH (head, body) AGAINST ('some words') AS relevance,

       MATCH (head) AGAINST ('some words') AS title_relevance

FROM pages

WHERE MATCH (head, body) AGAINST ('some words')

ORDER BY title_relevance DESC, relevance DESC


-- alternatively:

ORDER BY title_relevance + relevance DESC

如果您具有切换数据库引擎的灵活性,那么您还想研究的另一种方法是Postgres。它允许设置运营商的权重并进行排名。


查看完整回答
反对 回复 2019-10-15
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

我从未这样做过,但似乎


MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)

应该给头部找到的火柴加倍的重量。


在文档中应注意,“布尔模式”几乎总是返回相关性1.0。为了获得有意义的关联性,您需要:


SELECT MATCH('Content') AGAINST ('keyword1 keyword2') as Relevance 

FROM table 

WHERE MATCH ('Content') AGAINST('+keyword1+keyword2' IN BOOLEAN MODE) 

HAVING Relevance > 0.2 

ORDER BY Relevance DESC 

请注意,您正在执行常规的相关性查询,以获取相关性因子以及结合使用BOOLEAN MODE的WHERE子句。BOOLEAN MODE为您提供满足BOOLEAN搜索要求的子集,相关性查询满足相关性因子,并且HAVING子句(在这种情况下)确保文档与搜索相关(即得分小于0.2的文档)被认为无关紧要)。这也允许您按相关性排序。


查看完整回答
反对 回复 2019-10-15
?
忽然笑

TA贡献1806条经验 获得超5个赞

我也只是在玩这个。添加额外权重的一种方法是在代码的ORDER BY区域中。


例如,如果要匹配3个不同的列,并希望对某些列进行更重的加权:


SELECT search.*,

MATCH (name) AGAINST ('black' IN BOOLEAN MODE) AS name_match,

MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE) AS keyword_match,

MATCH (description) AGAINST ('black' IN BOOLEAN MODE) AS description_match

FROM search

WHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE)

ORDER BY (name_match * 3  + keyword_match * 2  + description_match) DESC LIMIT 0,100;


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 683 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信