好的,我尝试在多个列中进行全文搜索,简单的如下所示:
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-server上运行它。(WAMP在本地测试中)
发布于 2011-06-10 18:29:05
这可能会增加与你想要的头部部分的相关性。它不会加倍,但对你来说可能已经足够好了:
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
如果您可以灵活地切换DB引擎,那么您还想研究的另一个选择是Postgres。它允许设置运算符的权重,并可以调整排名。
发布于 2013-01-19 00:54:37
只是为那些可能需要的人添加..别忘了修改表格!
ALTER TABLE table_name ADD FULLTEXT(column_name);
发布于 2011-06-07 09:26:08
我从来没有这样做过,但看起来
MATCH (head, head, body) AGAINST ('some words' IN BOOLEAN MODE)
应该对在头部找到的匹配给予双倍的权重。
只需阅读docs page上的这条评论,我想它可能会对你有价值:
由Patrick O‘’Lone于2002年12月9日早上6:51发布,在文档中应该注意到,在布尔模式下,几乎总是返回相关值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子句相结合的相关性因子。布尔模式提供满足布尔搜索要求的子集,相关性查询满足相关性因子,HAVING子句(在本例中)确保文档与搜索相关(即得分低于0.2的文档被视为不相关)。这还允许您按相关性排序。这可能是in BOOLEAN模式运行方式上的bug,也可能不是,尽管我在邮件列表上读到的评论表明IN BOOLEAN模式的相关性排名并不是很复杂,因此它本身并不适合实际提供相关文档。顺便说一句,我没有注意到这样做的性能损失,因为MySQL似乎只执行一次全文搜索,即使两个匹配子句是不同的。使用EXPLAIN来证明这一点。
因此,您似乎不必担心调用全文搜索两次,尽管您仍然应该“使用EXPLAIN来证明这一点”。
https://stackoverflow.com/questions/6259647
复制相似问题