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

2024-01-08

假设我有两列,关键字和内容。我对两者都有全文索引。我希望关键字中包含 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 查询缓存进行基准测试,否则您的结果将出现偏差)。这不是谷歌级的效率,但它非常简单并且“开箱即用”,而且几乎可以肯定它比您在查询中使用“like”要好得多。

我发现它效果非常好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 数据读取过程中遇到致命错误

    我正在进行定期更新表扫描 Using connect1 As New MySqlConnection ConnectLocalhost serverString connect1 Open Dim cmd New MySqlCommand
  • Mac OSX 10.6 上的 Python mysqldb 不工作

    我正在使用 Python 2 7 并尝试让 Django 项目在 MySQL 后端运行 我已经下载了 mysqldb 并按照此处的指南进行操作 http cd34 com blog programming python mysql pyth
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我
  • 如何在 Laravel 5 中使用 Orchestral/Tenanti 构建具有多个数据库的多租户应用程序?

    我正在尝试使用 Laravel 5 构建和应用程序 它应该是使用多个数据库的多租户数据库架构 我的雇主出于安全目的要求这样做 我尝试手动管理主数据库迁移和租户迁移 但失败了 所以我决定借助 Laravel 特定包的帮助 这应该是我所需要的
  • 连接两个表而不返回不需要的行

    我的表结构如下所示 tbl users tbl issues userid real name issueid assignedid creatorid 1 test 1 1 1 1 2 test 2 2 1
  • 如何为“%abc%”搜索创建文本索引?

    我想对查询进行索引x like abc 如果我有一个如下表 create table t data varchar 100 我想创建一个索引以便能够有效地执行以下操作 select from t where contains abc 和这个
  • SQL Server 中全文搜索的奇怪行为

    我的 MyTable 带有列消息 NVARCHAR MAX ID 为 1 的记录包含消息 0123456789333444 Test 当我运行以下查询时 DECLARE Keyword NVARCHAR 100 SET Keyword 01
  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • 条件对列表的 In 子句

    有一个表 我需要通过在配对值列表中应用和条件来获取分页记录 下面是解释 假设我有一堂课Billoflading其中有各个领域 表中两个重要字段是 tenant billtype 我有一个包含值的对列表 tenant1 billtype1 t
  • 如何在没有 DROP 数据库权限的情况下从命令行删除所有 MySQL 表? [复制]

    这个问题在这里已经有答案了 如何使用命令提示符删除 Windows MySQL 中的所有表 我想这样做的原因是我们的用户有权访问数据库删除 但无权重新创建数据库本身 因此我们必须手动删除表 有没有办法一次删除所有表 请记住 大多数表都与外键
  • 在多维数组 PHP 的所有键中搜索

    我想在多维数组中的所有键中搜索特定字符串 我只需要弄清楚它是否存在 仅此而已 我想知道访问者的 IP 是否存在于任何数组中 有没有我可以用来执行此操作的 php 函数或方法 我尝试过的每个函数或方法总是返回 false 数组中 数组搜索 数
  • 使用表白名单选项更新 Debezium MySQL 连接器

    我正在使用 Debezium 0 7 5 MySQL 连接器 并且我试图了解如果我想使用以下选项更新此配置 最好的方法是什么table whitelist 假设我创建了一个连接器 如下所示 curl i X POST H Accept ap
  • 将非常大的Python列表输出保存到mysql表中

    我想将 python 生成的列表的输出保存在 mysql 数据库的表中 该表如下所示 mysql 中的 myapc8 表 https i stack imgur com 4B4Hz png这是Python代码 在此输入图像描述 https
  • Monkeyrunner/jython 中未找到 JDBC 驱动程序错误

    我需要在中插入一些东西DB 我在用着JDBC as a connector jython the script mysql数据库和脚本正在运行CentOS 我的代码看起来像这样 from com android monkeyrunner i
  • MySQL 两种日期格式之间的转换

    用户将以这种格式输入日期 2017 年 2 月 17 日 存储在 mysql 数据库中的日期格式如下 2015 02 17 00 00 00 我想做的是 SELECT FROM insurance where DATE FORMAT in
  • 无法加载身份验证插件“caching_sha2_password”

    我正在将 MySQL 8 0 与 MySQL Workbench 连接并收到以下错误 无法加载身份验证插件 caching sha2 password dlopen usr local mysql lib plugin caching sh
  • 索引在 NOT IN 或 <> 子句中起作用吗?

    我读过 至少 Oracle 数据库中的普通索引基本上是 B 树结构 因此存储处理适当根节点的记录 小于 根的记录被迭代地存储在树的左侧部分 而 大于 根的记录被存储在右侧部分 正是这种存储方法有助于通过树遍历实现更快的扫描 因为深度和广度都
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID

随机推荐

  • 如果程序的一部分表现出未定义的行为,它会影响程序的其余部分吗?

    假设程序员忘记初始化他的一个自动变量 并且他使用了它的值 从而调用了未定义的行为 int i 0 j printf value of j d n j char buf 256 fputs Enter query stdout fgets b
  • nvlink、可重定位设备代码和静态设备库

    在调查可重定位设备代码的一些问题时 我偶然发现了一些我不太理解的东西 这是如图所示的用例slide 6 http on demand gputechconf com gtc express 2012 presentations gpu ob
  • 无法使用 rarfile 模块提取 RAR 存档

    我一直在尝试制作一个提取 rar 文件的脚本 但收到错误 我一直在努力理解该模块的文档 但无济于事 我是编程新手 所以有时会迷失在所有文档中 这是我的代码的相关部分以及收到的错误 我的代码片段 import rarfile rarpath
  • 我可以在 Flutter 中使用自定义环境变量吗?

    我想以与我的同事不同的方式配置我们的日志库 并且我不想冒险检查我的本地配置 即 void main LOG minLevel Logger VERBOSE LOG showSymbols false runApp RestartWidget
  • 如何检测文本中的源代码?

    是否可以检测文本中的编程语言源代码 主要是 Java 和 C 例如我想知道本文中是否有源代码部分 text text text text text text text text text text text text text text t
  • 理解Java中的继承和抽象类

    好吧 我通过谷歌搜索寻找文档 但是我没有找到任何真正描述我想要回答的内容 所以我在这里问你们 所以我得到了继承 以及它是如何工作的 我遇到的问题是有时我看到一个对象最初定义为一种类型 然后设置为不同的类型 但我不明白到底发生了什么 这是一个
  • python 找到两个numpy数组的交点

    我有两个描述空间曲线的 numpy 数组 它们在一个点上相交 我想在两个数组中找到该交点的最近值 我有这段代码可以正常工作 但对于大量点来说它会变慢 from scipy import spatial def nearest arr0 ar
  • 在模板文字中使用条件语句

    我知道有更优雅的方法来定义包含变量的字符串 但如果我想在 ES6 之前添加一个条件 我会这样做 var a text conditional a b more text 现在使用模板文字我会做 let a if conditional a
  • 线程上的 Clojure 错误:java.lang.IllegalArgumentException:键必须是整数

    我对两件事感到困惑 一 错误消息本身 第二 这段代码启动了如此多的线程 我本以为它会启动 2 或 3 个线程来响应单个请求 但是当我在本地主机上运行它并将浏览器指向它 仅一次 时 它会启动 40 个线程 诚然 我使用的是 Chrome 它在
  • 我想在 JavaDoc 中添加 JavaScript

    div class en Documentation in English div div class nl Documentatie in Nederlands div public void myFunction 随后编辑 JavaDo
  • QT:qmake 无法识别 3dcore、3drender

    我在用qmake编译我的QT项目 在我的 pro文件我有一行 QT 3dcore 3drender 3dinput 3dextras 执行时qmake myprofile pro我收到错误 Project ERROR Unknown mod
  • Clojure deftype 中的可变字段?

    我正在尝试 Clojure 1 2 特别是受支持的可变字段deftype根据clojure org 文档 http clojure org datatypes 但我无法让装置工作 更新字段的语法是什么 或者可变性还没有实现吗 definte
  • 通过 XAML 绑定将自定义对象传递给 UserControl

    我想要做的是创建一个 UserControl 我可以向其传递一个 Address 对象 似乎当我经过Address Binding Path Person Address 到 UserControl 嵌入的 TextBox 绑定到Text
  • 类库和框架有什么区别

    我整天听到术语 类库 基类库 框架 框架的亮点是什么 基类库又是什么 类库和软件框架之间的区别特征是 在框架中 控制流不是由用户的代码决定的 而是由框架决定的 这也被称为好莱坞原则 不要给我们打电话 我们给您打电话 顺便说一下 还有一个不错
  • 如何使用 PowerShell 将文件移至回收站?

    当使用rm在Powershell中使用命令删除文件 它们将被永久删除 相反 我希望将已删除的项目放入回收站 就像通过 UI 删除文件时发生的情况一样 如何在 PowerShell 中执行此操作 2017年答案 使用回收模块 https ww
  • 在 Php PDO 的 bindValue 中使用 $id 之前是否需要使用 (int)$id

    我刚刚开始使用 Php 数据对象 我不确定的一件事是我是否必须在查询中使用某些变量之前验证它是否是整数 例如 像这样 id int POST id is this required query pdo gt prepare SELECT F
  • 如何连接到远程 hashcorpVault 服务器

    让我在这里解释一下我的用例 我想尝试在本地进行保管 所以我配置了VAULT ADDR as echo VAULT ADDR http 127 0 0 1 8200 然后我在开发模式下启动了vault vault server dev 一切正
  • Django Rest 框架中的 Post 请求处理

    我正在使用 Django Rest Framework 当前使用 Get 请求从后端提取一些数据 但由于 URL 限制变高 我们计划实现 Post 请求 为此 首先必须使后端 Django Rest API 能够服务于 post 请求 我是
  • 我如何知道应用内购买收据是否来自沙盒?

    iOS IAP 文档states https developer apple com library ios documentation NetworkingInternet Conceptual StoreKitGuide Develop
  • 如何操纵 MySQL 全文搜索相关性以使一个字段比另一个字段更“有价值”?

    假设我有两列 关键字和内容 我对两者都有全文索引 我希望关键字中包含 foo 的行比内容中包含 foo 的行具有更高的相关性 我需要做什么才能使MySQL对关键字匹配的权重高于内容匹配的权重 我正在使用 匹配 语法 解决方案 能够通过以下方