首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL match() and ()-是否按相关性和列排序?

MySQL match() and ()-是否按相关性和列排序?
EN

Stack Overflow用户
提问于 2011-06-07 08:56:02
回答 5查看 136.2K关注 0票数 82

好的,我尝试在多个列中进行全文搜索,简单的如下所示:

代码语言:javascript
复制
SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)

现在我想按相关度排序,(找到了多少个单词?)我用这样的东西就能做到:

代码语言:javascript
复制
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-server上运行它。(WAMP在本地测试中)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-10 18:29:05

这可能会增加与你想要的头部部分的相关性。它不会加倍,但对你来说可能已经足够好了:

代码语言:javascript
复制
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

如果您可以灵活地切换DB引擎,那么您还想研究的另一个选择是Postgres。它允许设置运算符的权重,并可以调整排名。

票数 159
EN

Stack Overflow用户

发布于 2013-01-19 00:54:37

只是为那些可能需要的人添加..别忘了修改表格!

代码语言:javascript
复制
ALTER TABLE table_name ADD FULLTEXT(column_name);
票数 15
EN

Stack Overflow用户

发布于 2011-06-07 09:26:08

我从来没有这样做过,但看起来

代码语言:javascript
复制
MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)

应该对在头部找到的匹配给予双倍的权重。

只需阅读docs page上的这条评论,我想它可能会对你有价值:

由Patrick O‘’Lone于2002年12月9日早上6:51发布,在文档中应该注意到,在布尔模式下,几乎总是返回相关值1.0。为了获得有意义的相关性,您需要:

代码语言:javascript
复制
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子句相结合的相关性因子。布尔模式提供满足布尔搜索要求的子集,相关性查询满足相关性因子,HAVING子句(在本例中)确保文档与搜索相关(即得分低于0.2的文档被视为不相关)。这还允许您按相关性排序。这可能是in BOOLEAN模式运行方式上的bug,也可能不是,尽管我在邮件列表上读到的评论表明IN BOOLEAN模式的相关性排名并不是很复杂,因此它本身并不适合实际提供相关文档。顺便说一句,我没有注意到这样做的性能损失,因为MySQL似乎只执行一次全文搜索,即使两个匹配子句是不同的。使用EXPLAIN来证明这一点。

因此,您似乎不必担心调用全文搜索两次,尽管您仍然应该“使用EXPLAIN来证明这一点”。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6259647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档