MySQL将()与()匹配-按相关性和列排序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

好的,我试着在多个列中搜索全文,如下所示:

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,但是在那个时候,我会在表中做三次相同的搜索,对于我要做的这个函数来说,性能是很重要的,因为查询将被连接并与其他表相匹配。

所以,我的主要问题是,是否有更快的方法来搜索相关性和优先排序某些列?(作为一种额外的奖励,甚至可能将相关的单词在列中出现的次数进行计数?)

任何建议或建议都会很好。

注:我会在服务器上运行这个。(在本地测试中使用)

提问于
用户回答回答于

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

用户回答回答于

MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)
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 

请注意,您正在执行常规关联查询,以获得关联因素,并使用布尔模式的WHERE子句。布尔模式为您提供满足布尔搜索要求的子集,关联查询满足关联因子,而HITH子句(在本例中)确保文档与搜索相关(即得分小于0.2的文档被认为无关)。这也允许您按相关性排序。虽然我在邮件列表中看到的评论表明,在布尔模式中的相关性排名并不十分复杂,但这可能是一个错误,也可能不是一个错误,因此实际上无法提供相关的文档。顺便说一句,我没有注意到这样做会导致性能损失,因为MySQL只执行一次全文搜索,尽管这两个匹配子句是不同的。用解释来证明这一点。

因此,可能你不需要担心调用全文搜索两次,尽管你仍然应该“使用解释来证明这一点”。

扫码关注云+社区