MySQL匹配()针对() – 按相关性和列sorting?

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

SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE) 

现在我想按照相关性sorting(有多less个单词被find?),我已经可以用这样的方法来做:

 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 ,但是在那一点上,我会在表中做三次相同的search,而且我做这个function的时候,性能很重要,因为查询将被连接并与其他表相匹配。

所以,我的主要问题是 ,有没有更快的方式来search相关性和优先列某些列? (作为一个奖金,甚至可能使相关次数的单词出现在列?)

任何build议或意见将是伟大的。

注意:我将在LAMP服务器上运行。 (WAMP在本地testing)

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

 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 

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

尽pipe我在邮件列表上看到的评论表明IN BOOLEAN MODE的相关性排名不是很复杂,因此实际上提供相关文件的能力很差,这可能也可能不是BOOLEAN MODE运行方式中的一个缺陷。 顺便说一句 – 我没有注意到这样做的性能损失,因为它似乎MySQL只执行一次FULLTEXTsearch,即使两个MATCH子句是不同的。 使用EXPLAIN来certificate这一点。

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

只是join谁可能需要..不要忘记改变表!

 ALTER TABLE table_name ADD FULLTEXT(column_name); 

我也只是在玩这个。 您可以添加额外重量的一种方法是在代码的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;