MySQL匹配()反对()
好的,所以我试图在多个栏目中进行全文搜索,像这样简单:
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在本地测试)
这可能会增加您想要的头部部分的相关性。 它不会加倍,但它可能足够你的缘故:
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
请注意,您正在执行常规相关性查询以获取与使用布尔模式的WHERE子句相关的相关因素。 BOOLEAN MODE为您提供满足BOOLEAN搜索要求的子集,相关查询实现相关因子,HAVING子句(在这种情况下)确保文档与搜索相关(即得分低于0.2的文档被认为是不相关的)。 这也可以让你按相关性排序。
尽管我在邮件列表上看到的评论表明IN BOOLEAN MODE的相关性排名不是很复杂,因此实际上提供相关文档的能力很差,但这可能也可能不是一个错误。 顺便说一句 - 我没有注意到这样做的性能损失,因为它似乎MySQL只执行一次FULLTEXT搜索,即使两个MATCH子句是不同的。 使用EXPLAIN来证明这一点。
所以看起来您可能不需要担心两次调用全文搜索,尽管您仍然应该“使用EXPLAIN来证明这一点”
只需添加谁可能需要..不要忘记改变桌子!
ALTER TABLE table_name ADD FULLTEXT(column_name);
链接地址: http://www.djcxy.com/p/75315.html
下一篇: Mysql search with Match Against for searching relevant words