MySQL全文索引功能

article/2025/11/4 21:18:56

  • 说明
  • 自然语言全文索引
  • 布尔全文索引
    • 相关性计算
  • 扩展查询

官网地址:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html

说明

  1. 简介
    1).MySQL中的全文索引是FultLeXT类型的索引。
    2).全文索引只能用于InnoDB或MyISAM表,只能为CHAR、VARCHAR或文本列创建。
    3).在MySQL 5.7.6中,MySQL提供了支持中文、日文和韩文(CJK)的内置全文ngram解析器,以及用于日文的可安装MeCab全文解析器插件
    4).当创建表时,可以在CREATE TABLE语句中给出FULLTEXT索引定义,或者稍后使用ALTER TABLE或CREATE INDEX添加该定义。
    5).对于大型数据集,将数据加载到没有FULLTEXT索引的表中然后创建索引要比将数据加载到具有现有FULLTEXT索引的表中快得多。

  2. 查询语法结构

MATCH (col1,col2,...) AGAINST (expr [search_modifier])
search_modifier:{IN NATURAL LANGUAGE MODE| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION| IN BOOLEAN MODE| WITH QUERY EXPANSION}

3.全文索引的三种类型

  1. 自然语言搜索将搜索字符串解释为自然语言中短语。
  2. 布尔全文搜索
  3. 查询扩展搜索

自然语言全文索引

例子1,简单使用

CREATE SCHEMA `fulltextsearches` DEFAULT CHARACTER SET utf8 ;
mysql> CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR(200),body TEXT,FULLTEXT (title,body)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)mysql> INSERT INTO articles (title,body) VALUES('MySQL Tutorial','DBMS stands for DataBase ...'),('How To Use MySQL Well','After you went through a ...'),('Optimizing MySQL','In this tutorial we will show ...'),('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),('MySQL vs. YourSQL','In the following database comparison ...'),('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0mysql> SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)SELECT COUNT(*) FROM articlesWHERE MATCH (title,body)AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

说明:
对于自然语言全文搜索,MATCH()函数中命名的列必须与表中一些FULLTEXT索引中包括的列相同。对于前面的查询,请注意,MATCH()函数中命名的列(title和body)与文章表的FULLTEXT索引的定义中命名的列相同。要分别搜索标题或正文,您将为每个列创建单独的全文索引。
例子2:演示如何显式检索相关值

SELECT id, MATCH (title,body)
    AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score
    FROM articles;
+----+---------------------+
| id | score               |
+----+---------------------+
|  1 | 0.22764469683170319 |
|  2 |                   0 |
|  3 | 0.22764469683170319 |
|  4 |                   0 |
|  5 |                   0 |
|  6 |                   0 |
+----+---------------------+
6 rows in set (0.00 sec)

例子3:
查询返回相关值,并且按照降低相关性的顺序排序行。为了实现这个结果,指定Match()两次:一次在SELECT列表中,一次在WHERE子句中。这不会导致额外的开销,因为MySQL优化器注意到两个MATCH()调用是相同的,并且只调用一次全文搜索代码。

SELECT id, body, MATCH (title,body) AGAINST('Security implications of running MySQL as root'IN NATURAL LANGUAGE MODE) AS scoreFROM articles WHERE MATCH (title,body) AGAINST('Security implications of running MySQL as root'IN NATURAL LANGUAGE MODE);

这里写图片描述

布尔全文索引

例子1:简单使用

SELECT * FROM articles WHERE MATCH (title,body)AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial we will show ...   |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
|  6 | MySQL Security        | When configured properly, MySQL ... |
+----+-----------------------+-------------------------------------+

支持的运算符

  1. +:表示该单词必须出现在返回的每一行中。(前缀或者后缀,但InnoDB只能放到前面)
  2. -:表示该单词不能出现在返回的任何行中。(前缀或者后缀,但InnoDB只能放到前面)
  3. no operator:该单词是可选的,但包含它的行评分较高。
  4. @distance:仅InnoDB支持,测试两个或者两个以上的单词是不是都一定距离开始, for example, MATCH(col1) AGAINST(‘“word1 word2 word3” @8’ IN BOOLEAN MODE)
  5. > <:这两个运算符用于改变单词对分配给行的相关值的贡献。>操作符增加贡献,<操作符减少它
  6. ( ):括号将单词分组成子表达式。括号组可以嵌套。
  7. ~:单词对当前的匹配行贡献是负的
  8. *:单词匹配通配符,但也受InnoDB表的innodb_ft_min_token_size设置或MyISAM表的ft_min_word_len的影响。
  9. “:匹配按字面意义包含该短语的行

相关性计算

TF-IDF 公式
这里写图片描述

mysql> CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title,body)
) ENGINE=InnoDB;
Query OK, 0 rows affected (1.04 sec)mysql> INSERT INTO articles (title,body) VALUES
('MySQL Tutorial','This database tutorial ...'),
("How To Use MySQL",'After you went through a ...'),
('Optimizing Your Database','In this database tutorial ...'),
('MySQL vs. YourSQL','When comparing databases ...'),
('MySQL Security','When configured properly, MySQL ...'),
('Database, Database, Database','database database database'),
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
('MySQL Full-Text Indexes', 'MySQL fulltext indexes use a ..');                  
Query OK, 8 rows affected (0.06 sec)
Records: 8  Duplicates: 0  Warnings: 0mysql> SELECT id, title, body, MATCH (title,body)  AGAINST ('database' IN BOOLEAN MODE)
AS score FROM articles ORDER BY score DESC;
+----+------------------------------+-------------------------------------+---------------------+
| id | title                        | body                                | score               |
+----+------------------------------+-------------------------------------+---------------------+
|  6 | Database, Database, Database | database database database          |  1.0886961221694946 |
|  3 | Optimizing Your Database     | In this database tutorial ...       | 0.36289870738983154 |
|  1 | MySQL Tutorial               | This database tutorial ...          | 0.18144935369491577 |
|  2 | How To Use MySQL             | After you went through a ...        |                   0 |
|  4 | MySQL vs. YourSQL            | When comparing databases ...        |                   0 |
|  5 | MySQL Security               | When configured properly, MySQL ... |                   0 |
|  7 | 1001 MySQL Tricks            | 1. Never run mysqld as root. 2. ... |                   0 |
|  8 | MySQL Full-Text Indexes      | MySQL fulltext indexes use a ..     |                   0 |
+----+------------------------------+-------------------------------------+---------------------+
8 rows in set (0.00 sec)

结果:
共有8个记录,其中3个匹配“数据库”搜索项。第一记录(ID 6)包含搜索项6次,并且具有1.0886961221694946的相关性排序。使用TF值6(在记录id 6中“数据库”搜索项出现6次)和IDF值0.42596873216370745(其中8是记录的总数,3是搜索项出现的记录数)来计算该排名值:

${IDF} = log10( 8 / 3 ) = 0.42596873216370745${rank} = ${TF} * ${IDF} * ${IDF}mysql> SELECT 6*log10(8/3)*log10(8/3);
+-------------------------+
| 6*log10(8/3)*log10(8/3) |
+-------------------------+
|       1.088696164686938 |
+-------------------------+
1 row in set (0.00 sec)

这里写图片描述

扩展查询

当搜索短语太短时,这通常很有用,这通常意味着用户依赖于全文搜索引擎缺乏的隐含知识。例如,搜索“database”的用户可能真的意味着“MySQL”、“Oracle”、“DB2”和“RDBMS”都是应该与“database”匹配并且也应该返回的短语。

例子:

mysql> SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)mysql> SELECT * FROM articlesWHERE MATCH (title,body)AGAINST ('database' WITH QUERY EXPANSION);
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
+----+-----------------------+------------------------------------------+
6 rows in set (0.00 sec)

http://chatgpt.dhexx.cn/article/u9qkuVyf.shtml

相关文章

Mysql——全文索引

概念&#xff1a; 一般查询都是根据数值范围或者精准的字符串进行数据过滤查询&#xff0c;而全文索引则通过关键字的匹配来进行查询过滤&#xff0c;那么就需要基于相似度的查询&#xff0c;而不是原来的精确数值或字符串比较。 版本支持&#xff1a; 在MySQL 5.7.6之前&am…

全文索引原理详解

一、总论 根据http://lucene.apache.org/java/docs/index.html 定义&#xff1a; Lucene 是一个高效的&#xff0c;基于Java 的全文检索库。 所以在了解Lucene之前要费一番工夫了解一下全文检索。 那么什么叫做全文检索呢&#xff1f;这要从我们生活中的数据说起。 我们生活中的…

mysql 全文索引使用以及限制

项目场景&#xff1a; 最近在做性能优化&#xff0c;有使用到全文索引&#xff0c;做下记录。 问题描述 我们在做列表查询的时候&#xff0c;大多数情况都会遇到 like %%的查询&#xff0c;而这种查询会让索引失效 在数据量较大的时候&#xff0c;会让查询变得很慢&#xff0…

Mysql全文索引解析

parser与N-gram Parser分词器选择 及 ft_min_word_len与innodb_ft_min_token_size的区分及界定 学习《高性能mysql&#xff08;第三版&#xff09;》这本书时&#xff0c;学到了全文索引这一张节&#xff0c;但作者当时使用的版本是MySQL 5.5&#xff0c;届时只有MyISAM引擎支…

全文索引原理介绍

一、总论 根据http://lucene.apache.org/java/docs/index.html 定义&#xff1a; Lucene 是一个高效的&#xff0c;基于Java 的全文检索库。 所以在了解Lucene之前要费一番工夫了解一下全文检索。 那么什么叫做全文检索呢&#xff1f;这要从我们生活中的数据说起。 我们生活中的…

什么是全文索引,为什么要使用全文索引?

MySQL中什么是全文索引&#xff0c;为什么要使用全文索引&#xff1f; 1.全文索引在查找上方面其效率是普通模糊&#xff08;like&#xff09;查询的N倍2.MySQL 5.7.6 之后的版本innodb支持全文索引3.修改配置文件 my.ini 或者my.conf 增加以下配置innodb_ft_min_token_size …

MySQL全文索引怎么创建

mysql全文索引 很慢&#xff0c;速度不如like的百分之一 从explain开始说起吧&#xff0c;很显然第一个sql语句压根没用任何索引(key列内什么都没有)&#xff01;第二个倒是用到索引&#xff0c;却是主键索引&#xff0c;并非你添加的fulltext索引&#xff01; 接下来&#xff…

SQL Server 全文索引的应用

在公司项目中提出了一个需求&#xff1a; 搜索包含指定关键词的数据。得到这需求后&#xff0c;站在技术角度考虑第一时间就联想到使用SQL里面“like”查询语句。进一步分析需求后&#xff0c;发现“Like”查询满足不到实际的要求。 示例&#xff1a; ---------------------…

全文检索

本文我将为大家讲解全文检索技术——Lucene&#xff0c;现在这个技术用到的比较多&#xff0c;我觉得大家还是应该掌握一下&#xff0c;不说多精通&#xff0c;但是应该有所了解。在讲解之前&#xff0c;我们先来看一个案例&#xff0c;通过该案例引出全文检索技术——Lucene。…

mysql全文索引使用

一、前言 在以前的博客中小编介绍过mysql的执行流程&#xff0c;索引优化等。正好前一段时间项目有一个新的需求&#xff0c;就重新调研了一下mysql的全文索引&#xff0c;并对mysql的全文索引进行了压测&#xff0c;看看性能怎么样。以判断是否使用。——可想而知&#xff0c;…

MySQL使用全文索引(fulltext index) 及中文全文索引使用

全文索引介绍 ----------------------------------------------------------------------------------------------------------------------------- 1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的My…

索引和全文检索

目录 索引 全文检索 学习类容&#xff1a;索引和全文检索 索引 索引&#xff1a;对数据库中一列或多列的值进行排序的一种结构 作用&#xff1a;合理的使用索引可以加速检索表中的数据。 分类&#xff1a; 按键列个数区分&#xff1a;单列索引&#xff0c;多列索引。 按…

MySQL使用全文索引(fulltext index)

1.创建全文索引(FullText index) 旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。 不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引&#xff0c;所以具体信息要随时关注官网&#xff0c; 1.1. 创建表的同时创建全文索引 CREATE TABLE article ( …

MySQL 全文索引

说到查询&#xff0c;日常中常用的baidu&#xff0c;cnbing ,google等之类的网站。关系型数据库中的全文索引应该也是从这些搜索引擎里摸索出来的。 全文索引介绍&#xff1a; 在数据库中常用的查询方式一般是 等价&#xff0c;范围方式。当然也有LIKE %的模糊查询&#xff0c…

MySQL索引系列:全文索引

什么是全文索引&#xff1f; 全文索引首先是 MySQL 的一种索引类型&#xff0c;也是搜索引擎的关键技术。 试想在1M大小的文件中搜索一个词&#xff0c;可能需要几秒&#xff0c;在100M的文件中可能需要几十秒&#xff0c;如果在更大的文件中搜索那么就需要更大的系统开销&am…

全文索引简介

全文索引技术就是将各种信息&#xff0c;文档中所有的文字序列都作为检索对象&#xff0c;找出包含检索词汇的信息或文档。 全文索引在数据库中一般是作为单独模块使用的&#xff0c;如MYSQL全文检索工具——Sphinx&#xff0c;一般全文索引模块需要配合数据库的存储方式进行处…

【MySQL】全文索引详解

文章目录 &#x1f340;全文索引概述 &#x1f340;全文索引的创建 &#x1f340;创建表时定义索引 &#x1f340;在已存在表上创建 &#x1f340;执行create语句 &#x1f340;执行ALTER TABLE语句 全文索引概述 全文索引主要对字符串类型建立基于分词的索引&#xff0c…

html怎么异步传数据,用jQuery实现异步通信(用json传值)方法步骤

jQuery是时下比较流行的一个js库&#xff0c;能够用简单的代码做出理想的效果&#xff0c;就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法&#xff0c;本人就用jquery实现上篇中用ajax实现异步通信的效果&#xff0c;感受一下jqu…

用jQuery实现异步通信(用json传值)具体思路

jQuery是时下比较流行的一个js库&#xff0c;能够用简单的代码做出理想的效果&#xff0c;就像官网上说的那样“write less ,do more”。Jquery在一定程度上改写了以往对JavaScript的写法&#xff0c;本人就用jquery实现上篇中用ajax实现异步通信的效果&#xff0c;感受一下jqu…

jQuery的toggle

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><!--引入jq框架--><script src"https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script></head><body>…