假设我有两列,关键字和内容。我对两者都有一个全文索引。我希望关键字中包含 foo 的行比内容中包含 foo 的行具有更高的相关性。我需要做什么才能使 MySQL 将关键字中的匹配权重高于内容中的匹配?
我正在使用“匹配”语法。
解决方案:
能够通过以下方式完成这项工作:
SELECT *,
CASE when Keywords like '%watermelon%' then 1 else 0 END as keywordmatch,
CASE when Content like '%watermelon%' then 1 else 0 END as contentmatch,
MATCH (Title, Keywords, Content) AGAINST ('watermelon') AS relevance
FROM about_data
WHERE MATCH(Title, Keywords, Content) AGAINST ('watermelon' IN BOOLEAN MODE)
HAVING relevance > 0
ORDER by keywordmatch desc, contentmatch desc, relevance desc
最佳答案
创建三个全文索引
- a) 关键字列上的一个
- b) 内容列中的一个
- c) 关键字和内容列中的一个
然后,您的查询:
SELECT id, keyword, content,
MATCH (keyword) AGAINST ('watermelon') AS rel1,
MATCH (content) AGAINST ('watermelon') AS rel2
FROM table
WHERE MATCH (keyword,content) AGAINST ('watermelon')
ORDER BY (rel1*1.5)+(rel2) DESC
关键是 rel1
仅在 keyword
列中为您提供查询的相关性(因为您仅在该列上创建了索引)。 rel2
做同样的事情,但对于 content
列。您现在可以应用您喜欢的任何权重将这两个相关性分数相加。
但是,您没有使用这两个索引中的任何一个进行实际搜索。为此,您使用位于两列上的第三个索引。
(关键字,内容)上的索引控制您的记忆。也就是返回什么。
两个独立的索引(一个仅针对关键字,一个仅针对内容)控制您的相关性。您可以在此处应用自己的权重标准。
请注意,您可以使用任意数量的不同索引(或者,可能会根据其他因素改变您在查询时使用的索引和权重……如果查询包含停用词,则仅搜索关键字……减少如果查询包含超过 3 个单词...等),则关键字的加权偏差。
每个索引都会占用磁盘空间,因此索引越多,磁盘就越多。反过来,mysql的内存占用更高。此外,插入需要更长的时间,因为您需要更新更多索引。
您应该根据您的情况对性能进行基准测试(小心关闭 mysql 查询缓存以进行基准测试,否则您的结果将出现偏差)。这不是谷歌级别的效率,但它非常简单且“开箱即用”,而且几乎可以肯定比您在查询中使用“喜欢”要好得多。
我觉得效果很好。
关于mysql - 如何操纵 MySQL 全文搜索相关性以使一个字段比另一个字段更多 'valuable'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/547542/