创建三个全文索引
- 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 查询缓存进行基准测试,否则您的结果将出现偏差)。这不是谷歌级的效率,但它非常简单并且“开箱即用”,而且几乎可以肯定它比您在查询中使用“like”要好得多。
我发现它效果非常好。