mysql全文索引____内置分词变量

上一节,我们发现搜索‘a‘,但是发现‘aa‘,‘aaa‘,‘aaaa‘搜索不出来。为什么呢?

这就涉及到mysql的一个内置变量ft_boolean_syntax。

ft_boolean_syntax
Variable_name    Value
ft_boolean_syntax    + -><()~*:""&|(其中有一个空格)

该变量的意思,表示需要被全文索引的字段通过以上这些变量进行分词切分。

譬如有一段字符串"a,b,c,ab",如果用mysql的内部分词算法,将这段字符串切分的话,会被切分为四段,分别是:

a
b
c
ab

然后根据这四段进行索引存储。然后我们匹配的时候,是直接拿需要搜索的和这四段字符串进行等值匹配。

所以,我们搜索a关键字,只会搜索到a,却无法搜索到ab。但是,我们要想搜索到ab怎么办呢?也是可以用全文索引的通配符的,在布尔模式下搜索a*就能匹配到。

同理,我们再模拟上次的数据

CREATE TABLE mysql_fulltext
(id BIGINT UNSIGNED AUTO_INCREMENT,
text_info VARCHAR(1000) NOT NULL,
PRIMARY KEY(id),
FULLTEXT(text_info)
)ENGINE=MYISAM DEFAULT CHARSET utf8 COMMENT ‘mysql全文索引测试表‘;
 
INSERT INTO `mysql_fulltext`(text_info)  VALUES (‘a‘),(‘b‘),(‘c‘),(‘aa‘),(‘bb‘),(‘cc‘),(‘aaa‘),(‘bbb‘),(‘ccc‘),(‘aaaa‘),(‘bbbb‘),(‘cccc‘);

同样,我们先执行下面的sql语句

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘a‘);

发现只能搜索到a所在的行。

但是,我们通过布尔模式下,搜索a*来尝试改变sql语句

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘a*‘ IN BOOLEAN MODE);

发现结果如下:

看到,已经能够搜索到a,aa,aaa,aaaa了。

但是,我们我们再次写入如下数据

INSERT INTO `mysql_fulltext`(text_info)  VALUES  (‘ba‘),(‘ca‘);

再次执行

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘a*‘ IN BOOLEAN MODE);

发现无法搜索出ba和ca所在的行。

为什么呢?因为ba和ca两个字符串都没有

ft_boolean_syntax    + -><()~*:""&|(其中有一个空格)

包含涉及到的变量,所以,无法被mysql的全文索引引擎切分为独立的分词进行存储。

我们再次写入如下数据

INSERT INTO `mysql_fulltext`(text_info)  VALUES  (‘b,a‘),(‘c,a‘);

再次执行

SELECT * FROM `mysql_fulltext` WHERE MATCH(text_info) AGAINST(‘a*‘ IN BOOLEAN MODE);

发现结果如下:

已经能搜索出‘b,a‘和‘c,a‘所在的行。

注意:全文索引并不是能搜索出字符串里面的任意字符,只能搜索出有ft_boolean_syntax变量的片段开头的字符串。如ba,无法通过a进行搜索,但是b,a却可以通过a进行搜索;b,abc可以通过布尔模式下的a*进行搜索,也可以通过布尔模式下的b*进行搜索,但是无法通过布尔模式下的c*进行搜索。

时间: 2024-10-11 06:50:36

mysql全文索引____内置分词变量的相关文章

MySQL中的内置系统函数

MySQL中的内置系统函数 用在SELECCT语句, 能及子句 where order by having 中 UPDATE DELETE, 函数中可以将字段名作为变量来用,变量的值就是这个列对应的每一行记录 一.字符串函数 php中用的函数,MySQl中大部也提供 1. CONCAT(S1,S2....SN): 把传入的参数连接成一个字符串 2. INSERT(str, x, y, insert): 将字符串X位置开始,y个字符串长度替换为字符串insert 3. LOWER(str) UPP

Flask内置URL变量转换器

Flask内置URL变量转换器: 转换器通过特定的规则执行,"<转换器: 变量名>".<int: year>把year的值转换为证书,因此我们可以在视图函数中直接对year变量进行数学计算: @app.route('/goback/<int:year>' def go_back(year):     return '<p>Welcom to %s ! </p>' %(2019-year) if __name__ == '__m

MYSQL 常见的内置函数与自定义函数

MySQL 内置函数: 字符函数 数值函数 时间日期函数 常见的数值函数的使用: 1 select avg(tdb_goods) from tdb_goods; //求字段值的平均数 内置的求和函数: 1 select sum(goods_price) from tdb_goods; //求字段值的和 常见的日期函数举例 1 select now(); 1 select current_timestamp(); 用户自定义函数: 语法 20.2.1. CREATE PROCEDURE和CREAT

[Perl] 内置特殊变量

一.正则表达式特殊变量:1.$n  :包含上次模式匹配的第n个子串2.$& :前一次成功模式匹配的字符串3.$`  :前次匹配成功的子串之前的内容4.$' :前次匹配成功的子串之后的内容5.$+ :前一次使用括号的模式匹配的字符串. 二.文件句柄特殊变量:1.$| :如果设置为零,在每次调用函数write或print后,自动调用函数fflush,将所写内容写回文件2.$% :当前输出页号3.$= :当前每页长度4.$- :当前页剩余的行数5.$~ :当前报表输出格式的名称.默认值是文件句柄名.6

nginx内置常用变量

HTTP核心模块支持一些内置变量,变量名与apache里的对应.比如 $http_user_agent,$http_cookie等表示HTTP请求信息的变量. 更多变量: $args, 请求中的参数; $content_length, HTTP请求信息里的”Content-Length”; $content_type, 请求信息里的”Content-Type”; $document_root, 针对当前请求的根路径设置值; $document_uri, 与$uri相同; $host, 请求信息中

Unity 内置Shader变量、辅助函数等

一:标准库里的常用.cginc文件 HLSLSupport.cginc - (automatically included) Helper macros and definitions for cross-platform shader compilation. HLSLSupport.cginc :(自动包含)跨平台着色器编译帮助宏和定义 UnityCG.cginc - commonly used global variables and helper functions. UnityCG.c

Perl内置特殊变量

一.正则表达式特殊变量: 1.$n  :包含上次模式匹配的第n个子串 2.$& :前一次成功模式匹配的字符串 3.$`  :前次匹配成功的子串之前的内容 4.$' :前次匹配成功的子串之后的内容 5.$+ :前一次使用括号的模式匹配的字符串. 二.文件句柄特殊变量: 1.$| :如果设置为零,在每次调用函数write或print后,自动调用函数fflush,将所写内容写回文件 2.$% :当前输出页号 3.$= :当前每页长度 4.$- :当前页剩余的行数 5.$~ :当前报表输出格式的名称.默

Jenkins内置环境变量

一.查看Jenkins有哪些环境变量 1.新建任意一个job 2.增加构建步骤:Execute shell 或 Execute Windows batch command 3.点击输入框下方的“可用环境变量” 4.可以看到有如下变量供使用: 变量名 解释 BUILD_NUMBER The current build number, such as "153" BUILD_ID The current build ID, identical to BUILD_NUMBER for bui

mysql全文索引____简介

生产环境中,用到mysql全文索引的童鞋应当是少数.但是我现在所在的工作中,非常广泛的用到mysql全文索引,统一做下笔记.也可以方便有需要的童鞋. 全文索引,英文叫做fulltext index,法文叫做L'index de texte intégral.使用环境,当需要在大量文本中搜索某些内容的时候:譬如文章搜索,百度搜索,淘宝搜索... 我现在所在环境用的最多的是网站商品信息搜索. mysql全文索引几点信息 mysql5.6之前,只有myisam支持全文索引.到了mysql5.6,inn