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

Kri*_*our 73 mysql full-text-search

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

SELECT * FROM pages WHERE MATCH(head, body) AGAINST('some words' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

现在我想按相关性排序(找到多少单词?),我可以用这样的东西做:

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
Run Code Online (Sandbox Code Playgroud)

现在这里出现了我迷失的部分,我想优先考虑head专栏中的相关性.

我想我可以创建两个相关列,一个用于head一个body,一个用于,但在那时我将在表中进行三次相同的搜索,并且对于我正在制作此功能,性能很重要,因为查询将连接并与其他表匹配.

所以,我的主要问题是,是否有更快的方法来搜索相关性并确定某些列的优先级?(作为奖励甚至可能使相关计数在列中出现的次数?)

任何建议或建议都会很棒.

注意:我将在LAMP服务器上运行它.(本地测试中的WAMP)

Den*_*rdy 149

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

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
Run Code Online (Sandbox Code Playgroud)

Postgres是一个你想要调查的替代方案,如果你有灵活的切换数据库引擎的话.它允许设置运营商的权重并玩弄排名.

  • 另外,MySQL 5.6支持InnoDB表的全文搜索! (14认同)

小智 11

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

ALTER TABLE table_name ADD FULLTEXT(column_name);
Run Code Online (Sandbox Code Playgroud)

  • 如果多次执行上述命令,则会为同一列创建多个索引.所以只运行一次这个命令. (2认同)

jis*_*one 9

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

MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)
Run Code Online (Sandbox Code Playgroud)

应该给头部的匹配重量加倍.


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

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 
Run Code Online (Sandbox Code Playgroud)

请注意,您正在进行常规相关性查询以获取与使用BOOLEAN MODE的WHERE子句相关的相关因子.BOOLEAN MODE为您提供满足BOOLEAN搜索要求的子集,相关性查询满足相关因子,HAVING子句(在本例中)确保文档与搜索相关(即得分低于0.2的文档)被认为是无关紧要的).这也允许您按相关性排序.

这可能是也可能不是IN BOOLEAN MODE操作方式的错误,尽管我在邮件列表上看到的评论表明IN BOOLEAN MODE的相关性排名不是很复杂,因此实际上提供相关文档的效果很差.BTW - 我没有注意到这样做的性能损失,因为看起来MySQL只执行一次FULLTEXT搜索,即使两个MATCH条款不同.使用EXPLAIN来证明这一点.

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


小智 5

我也只是在玩这个。添加额外权重的一种方法是在代码的 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;
Run Code Online (Sandbox Code Playgroud)

  • 将数学移动到 select 语句中,它减轻了很多负担。`SELECT search.*, (MATCH (name) AGAINST ('black' IN BOOLEAN MODE) * 3) + (MATCH (keywords) AGAINST ('black' IN BOOLEAN MODE)*2 + MATCH (description) AGAINST ('black' IN BOOLEAN MODE)) AS totalScore , FROM search WHERE MATCH (name, keyword, description) AGAINST ('black' IN BOOLEAN MODE) ORDER BY totalScore DESC LIMIT 0,100;` (5认同)