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;