fulltext mysql_mysql深入理解全文索引fulltext及实例剖析

fulltext mysql_mysql深入理解全文索引fulltext及实例剖析本文章通过以下几个小章节向大家介绍 mysql 全文索引的相关知识 mysql 全文索引原理及使用条件如何创建全文索引全文索引的基本语法及使用方法全文索引使用实例 mysql 全文索引使用条件首页要先明白 mysql 的全文检索原理 mysql 使用的是一个非常简单的剖析器来将文本分隔成词 空格 标点等 比如 welcomtoyou 将分隔为三个词 welcom to you 但是对中文来说 比如

本文章通过以下几个小章节向大家介绍mysql全文索引的相关知识:

mysql全文索引原理及使用条件

如何创建全文索引

全文索引的基本语法及使用方法

全文索引使用实例

mysql全文索引使用条件

首页要先明白mysql的全文检索原理:mysql使用的是一个非常简单的剖析器来将文本分隔成词,空格、标点等,比如‘welcom to you’将分隔为三个词‘welcom’、‘to’、‘you’,但是对中文来说,比如‘人力方网站正式上线’,这将无法分隔,因此目前mysql只支持 英文的全文检索。

mysql全文索引使用条件有两个,一个是对表存储引擎类型的要求,二是对设置全文索引字段的类型的要求。

表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引)

字段类型:只有字段类型为char、varchar和text的字段才能设置全文索引。

mysql如何创建全文索引

全文索引可以在创建表的时候设置,也可以在已有的表中进行设置。

1.创建表时设置全文索引,具体代码如下:

CREATE TABLE IF NOT EXISTS `category` (

`id` int(10) NOT NULL auto_increment,

`fid` int(10) NOT NULL,

`catname` char(255) NOT NULL,

`addtime` char(10) NOT NULL,

PRIMARY KEY (`id`),

FULLTEXT KEY `catname` (`catname`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

从上面代码可以看出,设置某字段为全文索引的SQL代码为FULLTEXT KEY `catname` (`catname`)

2.再已有的表中为某字段设置全文索引:

ALTER TABLE

或者直接在myphpadmin控制台中点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同。

mysql全文索引的基本语法

全文索引搜索语法

MATCH (列名1, 列名2,…) AGAINST (搜索字符串 [搜索修饰符])

其中在match里面指定的列名1、2等,就是在建立全文索引中指定的列名, 后面的搜索修饰符说明如下:

search_modifier:

{

IN NATURAL LANGUAGE MODE

| IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION

| IN BOOLEAN MODE

| WITH QUERY EXPANSION

}

如:

SELECT * FROM tableName WHERE MATCH(fields) AGAINST (‘search term’)

mysql全文索引实例

首页我们建立表与初始化数据

CREATE TABLE IF NOT EXISTS `category` (

`id` int(10) NOT NULL auto_increment,

`fid` int(10) NOT NULL,

`catname` char(255) NOT NULL,

`addtime` char(10) NOT NULL,

PRIMARY KEY (`id`),

FULLTEXT KEY `catname` (`catname`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

/* http://www.manongjc.com/article/1443.html */

INSERT INTO `category` (`id`, `fid`, `catname`, `addtime`) VALUES

(1, 0, ‘welcome to you!’, ”),

(2, 0, ‘hello phpjs,you are welcome’, ”),

(3, 0, ‘this is the fan site of you’, ”);

在具体实例之前,我们分析下msyql全文检索的语法:函数 MATCH() 对照一个文本集(包含在一个 FULLTEXT 索引中的一个或多个列的列集)执行一个自然语言搜索一个字符串。搜索字符串做为 AGAINST() 的参数被给定。搜索以忽略字母大小写的方式执行。说白了就是MATCH给定匹配的列(fulltext类型索引),AGAINST给定要匹配的字符串,多 个用空格、标点分开,mysql会自动分隔。

操作一:

SELECT * FROM `category` WHERE MATCH(catname) AGAINST(‘phpjs’)

返回结果:

id

fid

catname

addtime

2

0

hello phpjs,you are welcome

匹配出了含有phpjs关键字的行数据。

操作二:

SELECT * FROM `category` WHERE MATCH (catname) AGAINST (‘this’)

按照上面的思路,第三行数据含有this,因此应该可以匹配出第三行数据的,但事实却奇怪得很,返回结果为空,为什么呢?

原来是mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW VARIABLESLIKE ‘ft_min_word_len’ 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。

操作三:

这里我们要确定把最小字符改为2了,因为3行记录都有‘you’,因此心想,匹配‘you’就可以返回所有结果了

SELECT * FROM `category` WHERE MATCH (catname) AGAINST (‘you’)

返回结果还是为空,大跌眼镜了吧,这又是为什么呢?

原来mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个 特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是 100%,只有低于50%的才会出现在结果集中。

操作四:

有人会想,我不去管权重大小,只要有匹配的就给我返回结果集中,那么该如何做呢?

mysql到 4.0.1 时,可以使用 IN BOOLEAN MODE 修饰语来执行一个逻辑全文搜索

SELECT * FROM `category` WHERE MATCH(catname) AGAINST(‘you’ IN BOOLEAN MODE)

总结:

要注意最小字符的长度;

要注意关键词的权重;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233334.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月28日 下午4:01
下一篇 2025年7月28日 下午4:22


相关推荐

  • IO多路复用

    了解新知识之前需要知道的一些知识同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行异步(asynchronous):阻塞(blocking):

    2022年3月29日
    60
  • testNG接口自动化测试干货分享

    testNG接口自动化测试干货分享开发语言 java 干货内容 1 涉及框架 testNG springboot mock mybatis git httpclient Jenkins 等 2 接口测试理论链接 https pan baidu com s 16rS103xjCkP 提取码 y6yt

    2026年3月20日
    3
  • PyCharm使用pip安装第三方库

    PyCharm使用pip安装第三方库PyCharm 的学习中会使用到很多第三方库 我们直接使用 PyCharm 自带的 pip 安装这些工具包 首先打开 PyCharm 将左下方切换到 Terminal 如下图所示 这时安装过程中可能会出现如下错误 遇到这种问题时 我们首先检查自己的 pip 是否是最新的版本 若不是 则需要升级 使用 pipinstallup 这里我已经是最新版本 显示如下 然后继续尝试 pipinstall 还是失败 则使用如下命令 以安装 sklearn 包为例 pipinstallsk

    2026年3月27日
    2
  • Maven配置环境变量后不起作用的原因「建议收藏」

    Maven配置环境变量后不起作用的原因「建议收藏」Maven配置环境变量后不起作用的原因一.首先去maven官网下载maven相关文件点击左侧download选项选择图片中的Binaryziparchive apache-maven-3.8.1-bin.zip进行下载并解压到本地这个是解压后的文件二.配置环境变量1.添加MAVEN_HOME环境变量D:\Java\maven\apache-maven-3.8.12.添加M2_HOME环境变量(后面学习Spring会用到,可以先不进行配置)D:\Java\maven\apa

    2022年7月25日
    79
  • java二维数组随机赋值_java 二维数组随机赋值

    java二维数组随机赋值_java 二维数组随机赋值java二维数组随机赋值[2021-01-3100:08:55]简介:目的:使用二维数组打印一个10行杨辉三角。(视频教程推荐:java课程)思路:1.第一行有1个元素,第n行有n个元素;2.每一行的第一个元素和最后一个元素都是1;3.从第三行开始php修改二维数组中值的方法:1、通过【for($i=0;$i<count(Array());++…

    2022年6月4日
    65
  • java面试题汇总(一)_java框架面试题

    java面试题汇总(一)_java框架面试题SQL语句面试大全,两万字详解,专栏持续更新

    2022年8月29日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号