MySQL匹配()反对()

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

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在本地测试)


这可能会增加您想要的头部部分的相关性。 它不会加倍,但它可能足够你的缘故:

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。 它允许设置操作员的重量并玩弄排名。


我从来没有这样做,但似乎

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

应该给在头部找到的匹配双重。


请在文档页面阅读此评论,认为它可能对您有价值:

由Patrick O'Lone于2002年12月9日上午6:51发布

应该在文档中注意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 

请注意,您正在执行常规相关性查询以获取与使用布尔模式的WHERE子句相关的相关因素。 BOOLEAN MODE为您提供满足BOOLEAN搜索要求的子集,相关查询实现相关因子,HAVING子句(在这种情况下)确保文档与搜索相关(即得分低于0.2的文档被认为是不相关的)。 这也可以让你按相关性排序。

尽管我在邮件列表上看到的评论表明IN BOOLEAN MODE的相关性排名不是很复杂,因此实际上提供相关文档的能力很差,但这可能也可能不是一个错误。 顺便说一句 - 我没有注意到这样做的性能损失,因为它似乎MySQL只执行一次FULLTEXT搜索,即使两个MATCH子句是不同的。 使用EXPLAIN来证明这一点。

所以看起来您可能不需要担心两次调用全文搜索,尽管您仍然应该“使用EXPLAIN来证明这一点”


只需添加谁可能需要..不要忘记改变桌子!

ALTER TABLE table_name ADD FULLTEXT(column_name);
链接地址: http://www.djcxy.com/p/75315.html

上一篇: MySQL match() against()

下一篇: Mysql search with Match Against for searching relevant words