文档章节

MySQL必知必会-15MySQL全文搜索

z
 zhiliubai
发布于 2017/03/18 12:37
字数 716
阅读 93
收藏 0
MyISAM支持全文搜索,而InnoDB在MySQL 5.6.4开始支持。
性能,通配符和正则表达式匹配通常要求MySQL尝试匹配表中所有行(而且这些搜索极少使用表索引)
在使用全文本搜索时,MySQL不需要分别查看每个行,不需要分别分析和处理每个词。MySQL创建指定列中各词的一个索引,搜索可以针对这些词进行。MySQL可以快速有效地决定哪些词匹配(哪些行包含它们),哪些词不匹配,它们匹配的频率。

在索引之后,SELECT可与Match()和Against()一起使用以实际执行搜索。

启用全文本搜索支持
使用FULLTEXT指示对它进行索引,FULLTEXT可以索引单个列,也可以指定多个列。
在定义之后,MySQL自动维护该索引。在增加、更新或删除行时,索引随之自动更新。
可以在创建表时指定FULLTEXT,或者在稍后指定(这种情况下所有已有数据必须立即索引)

不要在导入数据时使用FULLTEXT
应该先导入所有数据,然后修改表定义FULLTEXT,有助于更快导入数据。

创建全文搜索的表
   
   
  1. CREATE TABLE productontes (
  2. note_id INT NOT NULL AUTO_INCREMENT,
  3. prod_id CHAR (10) NOT NULL,
  4. note_date datetime NOT NULL,
  5. note_text text NULL,
  6. PRIMARY KEY (note_id),
  7. FULLTEXT (note_text)
  8. ) ENGINE = MyISAM;


进行全文本搜索
在索引之后,使用两个函数Match()和Against()指定要使用的搜索表达式。
其中Match()指定被搜索的列,Against()指定要使用的搜索表达式。
   
   
  1. SELECT
  2. note_text
  3. FROM
  4. productnotes
  5. WHERE
  6. MATCH (note_text) AGAINST ('rabbit');
传递给Match()的值必须与FULLTEXT()定义中的相同。如果指定多个列,则必须列出它们(并且次序正确)

搜索不区分大小写
除非是用BINARY方式,否则全文本搜索不区分大小写。

全文本搜索排序
全文本搜索的一个重要部分就是对结果排序。具有较高的行先返回
   
   
  1. SELECT
  2. note_text,
  3. MATCH (note_text) AGAINST ('rabbit') AS rank
  4. FROM
  5. productnotes;
等级由MySQL根据行中词的数目、唯一词的数目、整个索引词的总数以及包含该词的行的数目的计算出来。

排序多个搜索项,如果指定多个搜索项,则包含多数匹配词的那些行将具有比包含较少词(或仅有一个匹配)的那些行高的等级。

让MySQL支持中文全文搜索
MySQL自带的ngram插件,用于支持中文、日语、韩语全文搜索,ngram在MySQL 5.7.6中引入。
创建表:
    
    
  1. CREATE TABLE articles (
  2. id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  3. title VARCHAR(200),
  4. body TEXT,
  5. FULLTEXT (title,body) WITH PARSER ngram
  6. ) ENGINE=InnoDB CHARACTER SET utf8mb4;
或者修改表
    
    
  1. ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

官网教程:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html

本文转载自:http://blog.csdn.net/zoroday/article/details/61921057

z
粉丝 0
博文 26
码字总数 0
作品 0
广州
私信 提问
5本数据库经典之作,没看过的都白学了!

  【IT168 评论】1、 《数据库系统实现》   内容简介:书中对数据库系统实现原理进行了深入阐述,并具体讨论了数据库管理系统的三个主要成分――存储管理器、查询处理器和事务管理器的实...

it168网站
2017/11/13
0
0
MySQL必知必会笔记

【英】ben Forta著 5   1.0 使用扩展查询         |---->select note from table where Match(note) Against('anl');                        |--->where ......

wei-spring
2014/05/28
0
0
自学书籍.MySQL必知必会 - 好书推荐

图书封面: 书籍简介: MySQL是世界上最受欢迎的数据库管理系统之一,书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用,子查询,正则表达式和基于全文本的搜索,存储过程,游标...

满满李
2016/04/24
409
0
《MySQL必知必会》笔记2

2016/2/26-27 第二十一章创建和操纵表 创建表 CREATE TABLE语句 IF NOT EXISTS:查看表名是否存在,并且仅在表名不存在时创建它。 NULL列和NOT NULL列。(NULL为默认设置) PRIMARY KEY:定义...

fxdhdu
2016/03/01
41
0
推荐《高性能MYSQL(第3版)》及 { MySQL性能管理及架构设计 }

最近项目所在服务器经常当机,我怀疑是不是数据库的问题,却不知从哪下手优化。 MySQL的性能优化一直是非常有必要学习的! 考虑 购买:《高性能MYSQL(第3版)》 同学福利:电子版终于找到:放...

phpervip
2017/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
80
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部