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

好的,所以我试图在多列中进行全文搜索,就像这样简单:


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 pages

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

ORDER BY relevance

现在这是我迷路的部分,我想在此head列中优先考虑相关性。


我想我可以创建两个相关性列,一个用于head,一个用于body,但是到那时,我将在表中进行三遍相同的搜索,而对于我要创建的函数,性能非常重要,因为查询将被联接并与其他表匹配。


因此,我的主要问题是,是否有更快的方法来搜索相关性并确定某些列的优先级?(作为奖励,甚至可能使相关性计数单词在列中出现的次数?)


任何建议或意见将是巨大的。


注意:我将在LAMP服务器上运行它。(本地测试中的WAMP)


拉莫斯之舞
浏览 682回答 3
3回答

慕码人8056858

这可能会增加与所需头部的相关性。它不会使它加倍,但它可能对您而言足够好:SELECT pages.*,       MATCH (head, body) AGAINST ('some words') AS relevance,       MATCH (head) AGAINST ('some words') AS title_relevanceFROM pagesWHERE MATCH (head, body) AGAINST ('some words')ORDER BY title_relevance DESC, relevance DESC-- alternatively:ORDER BY title_relevance + relevance DESC如果您具有切换数据库引擎的灵活性,那么您还想研究的另一种方法是Postgres。它允许设置运营商的权重并进行排名。

慕工程0101907

我从未这样做过,但似乎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的文档)被认为无关紧要)。这也允许您按相关性排序。

忽然笑

我也只是在玩这个。添加额外权重的一种方法是在代码的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_matchFROM searchWHERE MATCH (name, keywords, description) AGAINST ('black' IN BOOLEAN MODE)ORDER BY (name_match * 3  + keyword_match * 2  + description_match) DESC LIMIT 0,100;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL