mysql 全文索引

注意 并非所有的引擎都支持 全文检索

mysql最常用的引擎 INnodb 和 myisam 后者支持全文检索 前者不支持

创建表的时候指定要检索列 CREATE TABLE TEST_FULLTEXT(note_id int not null auto_increment,note_text text null, primaty key(note_id),FULLTEXT(note_text) )engine=myisam;

fulltext 索引某个列 fulltext(note_text) ,在某note_text列上建立全文索引

插入数据

然后用 match()指定列 Against()指定词

如 语句 select * from TEST_FULLTEXT where Match(note_text) Against('hello');

查找note_txt列中含有 hello词的行 返回的结果为 两行 note_text

'hello' was said by quester

quster say 'hello' to pp and he try again

- 注意 搜索是不区分大小的 除非使用 BINARY方式

既然这样 为什么 不用 like语句呢 再来看上面例子 用like实现

select * from TEST_FULLTEXT where note_text like '%hello%';

返回的结果一样为两行

note_text

quster say 'hello' to pp and he try again

'hello' was said by quester

看采用全文搜索和like的返回结果 使用全文搜索的返回结果是已经排好序的 而 like的返回结果则没有

排序主要是针对 hello出现在行的位置

全文结果中 第一个词 和 第三个词 like则没有按顺序排

Mysql主要根据等级来进行排序

我们可以采用下面方式查看 表中某一列 在某一个词的等级 ,继续用上面的例子 select note_text, Match(note_text) Aginst('hello') as rannk from TEST_FULLTEXT

输出如下: note_text rank

fhgjkhj 0

fdsf shi jian 0

quster say 'hello' to pp and he try again 1.3454876123454

huijia quba 0

'hello' was said by quester 1.5656454547876

等级的计算 由 mysql 由根据行中词的数目、唯一词的数目、整个索引中词的总数以及包含改词行的数目计算出来 不包含词的行的等级 为0 上面的结果中 词在前面的等级值要高于在后面的

使用查询扩展

当你想要在note_text 中查找 pp时 从上面知道 只有一行 如果用下面语句 select note_text from test_fulltext where match(note_text) against('pp');

返回结果是 note_text

quster say 'hello' to pp and he try again

如果采用扩展查询,分为以下三部

1、先根据全文检索 查找到 所有行 如上面的返回结果 只有一行

2、mysql检索上面1的所以行,选择有用的词

3、mysql再次全文检索,这一次还需要加上2中选择出来的有用的词 作为against中的词 select note_text from test_fulltext where match(note_text) against('pp' with query expansion);

返回结果 note_text

quster say 'hello' to pp and he try again

'hello' was said by quester

如pp本来有的行中含有 hello 所以hello也作为关键字

使用布尔查询

即使没有建立fulltext索引也能够用,但是速度非常慢 没有50%规则 (参见下 50%规则介绍)

可以用包含特定意义的操作符,如 +、-、"",作用于查询字符串上。查询结果不是以相关性排序的。

如语句 select note_text from test_fulltext where match(note_text) against('hello -pp*' IN BOOLEAN MODE );

表示匹配hello但是不包含 pp的行 结果为 note_text

'hello' was said by quester

全文检索的一些说明 和限制

1、只有MyISAM表支持

2、对大多数的多字节字符集适用,进行全文索引的列必须使用相同的字符集和校验码(collation)。

3、表意性语言,如汉语、日语没有词分界符(英语用空格隔开每个单词),全文分析器无法确定一个词的开始和结尾,所以MySQL中的全文检索不支持。

4、在自然语言检索中,只能检索被全文索引的那些列,如果要对索引的多列进行某一列的检索,必须对这一列单独建立全文索引。布尔检索可以在非索引的列上进行,但会慢一些。

5、against后的参数必须是常量字符串。

6、索引没有记录关键词在字符串中的位置,排序算法太单一。

7、如果索引不在内存中,检索速度会很慢;如果是短语查询,需要索引和数据都在内存中,否则速度会很慢,所以需要更大的key buffer。索引有碎片时也会很慢,所以需要更频繁的optimize table操作。

8、全文索引对于insert、update、delete都很慢。如更改100个词需要进行100次的索引操作而不是1次。

50% 规则 如果一个词出现在50%以上的行中,那么mysql将他作为一个非用词忽略 50%规则不适用于布尔查询

如果行数小于三行 则不返回结果 参考 50%规则

mysql 全文本检索的列_Mysql 全文本检索相关推荐

  1. mysql 增加主键列_MySQL添加列、删除列,创建主键等常用操作总结

    一. 列常用操作 ① 添加新的一列test_column,并将其作为主键,FIRST将其放在表中第一行,auto_increement是自动增长 alter table test_table add  ...

  2. mysql常见增量恢复方式_MySQL 全备份与增量备份 全恢复与增量恢复

    一,全备份 与 全恢复 1.vim /root/db_backup/mysqldump_mraz.php,内容如下: date_default_timezone_set("PRC" ...

  3. mysql引用表无效列_Mysql使用索引可能失效的场景

    1.WHERE字句的查询条件里有不等于号(WHERE column!=-),MYSQL将无法使用索引 2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=-) ...

  4. mysql新加一列_mysql如何增加表中新的列?

    mysql中可以使用"ALTER TABLE"语句来增加表中新的列,语法格式"ALTER TABLE 表名 ADD 新字段名 数据类型 [约束条件];":默认是 ...

  5. mysql单表数据列_MySQL 之 数据操作及单表查询

    1.数据操作 (1)insert 增加数据 1. 插入完整数据(顺序插入) 语法一: INSERT INTO 表名(字段1,字段2,字段3-字段n) VALUES(值1,值2,值3-值n); 语法二: ...

  6. mysql order by多列_mysql 多列索和order by

    多列索引的select * where * order by * 查询条件索引很难建立,需要不断调试,最后找出规则: 三原则: 1. 将经常要查询的字段放到多列索引的前面 2. 将要进行等值查询的字段 ...

  7. mysql授权某一列_mysql 数据库授权(给某个用户授权某个数据库)【转载】

    先设置该用户只有show database权限 grant select,insert,update,delete on redmine1.* tojira@"%" identif ...

  8. mysql自动获取时间列_mysql自动获取时间日期的方法

    实现方式: 1.将字段类型设为 TIMESTAMP 2.将默认值设为 CURRENT_TIMESTAMP 举例应用: 1.MySQL 脚本实现用例 --添加CreateTime 设置默认时间 CURR ...

  9. mysql的行转列_mysql查询:行转列,列转行,请不要再羞辱我了

    被一道行转列的sql面试题羞辱了,好伤心....... 大概有这么一个场景,有三个产品,分别是1,2,3,和三个仓库,分别是01,02,03,三个仓库分别储存三个产品,数量分布如下图: 产品(PID) ...

最新文章

  1. GPU上的基本线性代数
  2. EBS fnd_global.apps_initialize
  3. 为.Text加了注册模块
  4. troch3d open3d例子
  5. 使用python获取路径问题
  6. Linux / Server 端收到 SIGPIPE 信号的原因
  7. DCMTK:OFvariant的单元测试
  8. c语言不规则窗口,C语言不规则数组和指针
  9. JavaScript内部实现
  10. 华为 虚拟键盘_华为mate30 pro虚拟机械键盘特有体验,虽是虚拟,但却感受逼真...
  11. Spring容器创建流程(8)初始化bean
  12. 统计学里“P”的故事:蚊子、皇帝的新衣和不育的风流才子
  13. sqlsever主库从库如何切换_面试最让你手足无措的一个问题:你的系统如何支撑高并发?...
  14. 制版经验分享—使用AD18
  15. ipq4019 kernel 报错spi-nand spi0.1: spi transfer failed: -110
  16. linux伪造ip数据包,伪造ICMP数据包的IP层
  17. idea can‘t update no tracked branch choose upstream branch git
  18. IDEA项目名称后面出现中括号
  19. 使用虚拟信用卡在Poshmark下单教程和注意事项
  20. SD卡pin引脚说明及PCB layout指导

热门文章

  1. 1634C. OKEA
  2. Codeforces Round #734 (Div. 3) (A-D1)
  3. 用python将图片写入ppt_用python做ppt服务用于导入图片
  4. 安卓接受后台数据转换解析出错_安卓手机内存越大,速度就会越快?
  5. fedora 33 topbar_最新!新增确诊病例33例,其中本土病例1例
  6. V210 SPI驱动分析
  7. android4.0.3去掉底部状态栏statusbar,全屏显示示例代码
  8. WinCE系统字体的设置
  9. 发票管理软件_财务人员都在用的这款发票管理软件,真的值得购买么?
  10. 【转】重新打包DebianISO实现无人应答安装(UEFI+BIOS)