Mysql 全文搜索MATCH…AGAINST…

说明

MySQL中的全文索引是FULLTEXT类型的索引。

全文索引 只能使用 InnoDBMyISAM表格,并且只能用于创建CHARVARCHARTEXT列。

搜索基础

表达式

MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier说明

  • IN NATURAL LANGUAGE MODE

    自然语言全文检索模式

    默认情况下或使用IN NATURAL LANGUAGE MODE修饰符, MATCH()函数会针对文本集合执行字符串的自然语言搜索 。集合是FULLTEXT索引中包含的一个或多个列的集合 。搜索字符串作为参数给出AGAINST()。对于表中的每一行,MATCH()返回相关值; 也就是说,搜索字符串与MATCH()列表中指定的列中该行中的文本之间的相似性度量。

  • IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION

  • WITH QUERY EXPANSION

    盲查询扩展

    全文搜索支持查询扩展(特别是其变体“ 盲查询扩展 ”)。当搜索短语太短时,这通常很有用,这通常意味着用户依赖于全文搜索引擎所缺乏的隐含知识。例如,搜索“ 数据库 ”的用户可能实际上意味着 “ MySQL ”,“ Oracle ”,“ DB2 ”和“ RDBMS ”都是应该匹配“ 数据库 ”的短语 也应该归还。这是隐含的知识。

    通过添加WITH QUERY EXPANSIONIN NATURAL LANGUAGE MODE WITH QUERY EXPANSION跟随搜索短语来启用盲查询扩展(也称为自动相关性反馈)。它通过执行两次搜索来工作,其中第二次搜索的搜索短语是与来自第一次搜索的少数最高度相关的文档连接的原始搜索短语。

  • IN BOOLEAN MODE
    布尔全文搜索模式

    此修饰符,某些字符在搜索字符串中的单词的开头或结尾处具有特殊含义。在以下查询中, +-运算符分别表示一个单词必须存在或不存在才能进行匹配。

    注意

    在实现此功能时,MySQL使用有时被称为隐含布尔逻辑的内容,其中

    • + 代表 AND
    • - 代表 NOT
    • 默认为 OR

    参考资料

实例

# 查看版本
SELECT VERSION();
-- 输出: 8.0.13

# 建表
CREATE TABLE `t_match_against` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `label` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `name` (`name`,`label`)  WITH PARSER ngram
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

# 插入测试数据
INSERT INTO `test`.`t_match_against`(`id`, `name`, `label`) VALUES (3, 'dsadsadsa mysql ', 'dsadsadsa mysql ');
INSERT INTO `test`.`t_match_against`(`id`, `name`, `label`) VALUES (4, 'dsadsadsa mysql ', 'MySQL 5.7 中文全文检索使用教程');
INSERT INTO `test`.`t_match_against`(`id`, `name`, `label`) VALUES (5, 'MySQL 5.7 中文全文检索使用教程2', 'dsadsadsa mysql ');
INSERT INTO `test`.`t_match_against`(`id`, `name`, `label`) VALUES (6, '生成', '在使用中文检索分词插件ngram之前,先得在MySQL配置文件里面设置他的分词大小(默认是2),比如');
INSERT INTO `test`.`t_match_against`(`id`, `name`, `label`) VALUES (7, '代码部署工具syncd安装', 'syncd是什么?\r\nsyncd是一款开源的代码部署工具,它具有简单、高效、易用等特点,可以提高团队的工作效率.\r\n\r\nsyncd开源发布系统安装\r\n安装GO环境,此处不表\r\n安装Git环境,此处不表\r\n\r\n安装Nginx/Mysql\r\n\r\n配置部署机器ssh秘钥');

# 查询测试
SELECT
    * 
FROM
    t_match_against 
WHERE
    MATCH ( `name`, `label` ) against ( 'MySQL 教程 生成' );

# 查询相关性得分
SELECT
    id,
    NAME,
    label,
    MATCH ( `name`, `label` ) against ( ' 全文 检索 ' IN NATURAL LANGUAGE MODE) AS score 
FROM
    t_match_against 
ORDER BY
    score DESC;

参考文章

发表评论