mysql - 如何操纵 MySQL 全文搜索相关性以使一个字段比另一个字段更多 'valuable'?

标签 mysql search indexing full-text-search relevance

假设我有两列,关键字和内容。我对两者都有一个全文索引。我希望关键字中包含 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/

相关文章:

python - 如何从字符串中找到子字符串列表的位置?

.net - LINQ 查询的索引

mysql - 存储过程不存在,即使在创建之后

php - 如何使用 PHP 4 防止 $_POST 电子邮件字段的 SQL 注入(inject)

mysql - 带有字母的 Microsoft Access 号码字段

sql - 使用过滤器查询 jsonb 数组中的值

algorithm - 在 N x M 矩阵中找到最大邻居数等于它们在最佳时间的邻居数

php - Laravel:如何在子进程中通过 Eloquent 更新 MySQL?

python搜索图像谷歌图像

python - 与列标题对应的引用 DataFrame 值