当前位置: 首页 > 面试题库 >

如何处理MySQL全文搜索的相关性,以使一个字段比另一字段更“有价值”?

商正诚
2023-03-14
问题内容

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

问题答案:

实际上,使用case语句制作一对标记可能是一个更好的解决方案:

select 
...
, case when keyword like '%' + @input + '%' then 1 else 0 end as keywordmatch
, case when content like '%' + @input + '%' then 1 else 0 end as contentmatch
-- or whatever check you use for the matching
from 
   ... 
   and here the rest of your usual matching query
   ... 
order by keywordmatch desc, contentmatch desc

同样,这仅在所有关键字匹配项的排名高于所有仅内容匹配项的情况下。我还假设关键字和内容的匹配都最高。



 类似资料:
  • 问题内容: 有什么方法可以根据类型在同一字段上搜索结果? 我的基本提升是这样的: 但是对于其他一些文档,我希望标题不太重要,因此我尝试使用type作为前缀: 但是,这根本没有助益。作为最后的选择,我可以使用Funcsion / Script Score bu来避免这种情况。 例如,假设文档仅包含字段。 问题答案: 实现此目的的一种简单方法是将OP中的查询重写为dis- max查询 。 elasti

  • 我还没有为索引创建任何显式设置。谢了。

  • 问题内容: 我在想出可以验证JSON是否包含以下任一内容的JSON模式时遇到了麻烦: 仅一个字段 仅另一个领域 (其他两个字段之一) 但如果存在多个则不匹配。 具体来说,我要 和/或 进行验证,但我不想接受更多的验证。 这是到目前为止我得到的: 这比我想要的要匹配。我希望它符合以下所有条件: 但不符合: 我猜想我有明显的失踪-我想知道它是什么。 问题答案: 问题是“非”语义。“不需要”不表示“禁止

  • 问题内容: 我在具有以下映射的文档中有两个字段: 我如何找到所有与匹配的文档?禁用脚本是否有可能? 问题答案: 基本上,您需要使用脚本来执行此操作-即使由于完全将沙盒化了Lucene表达式而禁用了脚本,这也可能会起作用:

  • 我在编程一个订单提交页面时遇到了一个相当大的问题,该页面的目的是提交一个订单的争议--提供两个字段被填写,但只有当一个字段少于另一个字段时。 基本上,一个是下拉,另一个是争端框,查询如下: 如果DispotestExtBox=“”而下拉框=“请选择...” 一切正常-提交按钮已启用 如果DisportestExtBox!=“”而下拉框=“请选择...” 错误(反之亦然,因此如果填充了Dispone

  • 假设我有两个字段F1和f2。我想将F1更新为。我可以在Mongo中使用一个更新命令吗?