MySQL match()对() - 按相关性和列顺序排序?

时间:2011-06-07 00:56:02

标签: mysql full-text-search

好的,所以我正在尝试在多个列中进行全文搜索,这很简单:

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)

4 个答案:

答案 0 :(得分:144)

可能会提供与您想要的头部相关的增加的相关性。它不会加倍,但它可能足以让你满意:

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。它允许设置操作员的权重并使用排名。

答案 1 :(得分:11)

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

ALTER TABLE table_name ADD FULLTEXT(column_name);

答案 2 :(得分:9)

我从未这样做过,但似乎是

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

应该为头部中的匹配提供双重权重。


请在docs page上阅读此评论,认为它可能对您有价值:

  

Patrick O'Lone发表于12月9日   2002年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为您提供子集   满足了要求   BOOLEAN搜索,相关性查询   实现相关因素,并且   HAVING子句(在这种情况下)确保   该文件与该文件相关   搜索(即得分较低的文件)   超过0.2被认为是不相关的)。   这也允许您订购   关联。

这可能或可能   不是IN的方式的错误   BOOLEAN MODE运行,尽管如此   我在邮件列表上看过的评论   建议IN BOOLEAN MODE的   相关性排名不是很高   复杂,因此借给自己   实际提供相关的很差   文档。顺便说一句 - 我没注意到   这样做的性能损失,因为   看来MySQL只执行了   FULLTEXT搜索一次,即使是   两个MATCH条款不同。使用   解释证明这一点。

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

答案 3 :(得分:3)

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