全文本搜索

MySQL支持几种基本的数据库引擎,但并非所有的引擎都支持全文本搜索。两个最常使用的引擎为MyISAM和InnoDB,前者支持全文本搜索,后者就不支持。

理解全文本搜索

在前面的学习中,我们都知道有两种方式来匹配文本。一种是使用like关键字来进行匹配,另外一种就是使用正则表达式来进行匹配。

虽然使用正则表达式就可以编写查找所需行的足够复杂的匹配模式。但是,这些存在几个重要的限制影响:

1、性能:通配符和正则表达式时尝试匹配表中所有行,而这些搜索极少使用了表索引,因此,相当慢

2、明确控制:在匹配过程中,我们很少会相当的明确的知道我们想匹配什么,不匹配什么。

3、具有优先级的结果:在使用通配符和正则表达式进行匹配时,只是返回包含该匹配条件的结果,而不区分匹配程度(多个匹配和单个匹配的区别,在前面就匹配和在后面匹配的区别)。

上面提到的这些限制,都可以利用全文本搜索来进行解决。

使用全文本搜索

为了进行全文本搜索,必须索引被搜索的列,而且要随着数据的改变不断地重新索引。

在对表进行适当的设计之后,MySQL会自动进行所有的索引和重新索引。

在索引之后,select可与match() 和against()一起使用以实际执行索引。

那么,在建表的时候,如何启用全文本搜索支持呢???

如下: 

上面就这样通过fulltext 为指定行建立的相应的索引,如果,想指定多个列,将多个列都放入fulltext里面即可。

在定义之后,MySQL会自动维护该索引。无论是在增加、更新还是删除,索引也会随之更新。

进行全文本搜索

上面在建表后此表就有了全文本搜索的能力了,下面我们开始尝试下全文本搜索。 
在索引之前,我为test_text表增加了如下内容: 

当我们想利用全文本搜索得到 包含MySQL内容的数据。

如下:

select * from test_text where match(content) against('MySQL');

上面语句中 match(content) 指示MySQL针对指定的列进行搜索,注意:传递给match()的值必须与fulltext()定义中的相同。against(‘MySQL’)指定词MySQL作为搜索文本。

从结果可以看出,我们得到了两行包括MySQL字符串的数据。

上面的搜索利用我们学过的Like也可以完成,如下:

这两种方法的结果是一样的。次序也一样,理论上来说,利用全文本搜索会对出来的结果按照优先级来进行排序输出,但是从结果可以看出,在第一条语句中MySQL出现的位置相比第二条语句中的MySQL的位置还要滞后,为什么会出现在前面呢??,与MySQL必知必会上面介绍的有一点出入

为了验证上面出现的问题,我们可以查下结果的优先级。在查看优先级之前,我又加入了一个以MySQL开头的行数据。下面举来看下优先级。

select id,content,match(content) against('MySQL') from test_text ;

从结果可以看出,确实是id=7的行的优先级大于id=8的优先级,原因在于优先级并不至于出现的先后位置有关系,还与诸如文本长度等因素也有关系。

在增加了一行以MySQL开头的行数据之后,我们来一起观察下上面这两种方法的结果。

从上面两图可以明显看出,确实,利用全文本搜索对搜索到的内容进行一定的排序,而通配符却没有进行排序。至于全文本搜索对搜索到的内容进行排序由很多因素来进行决定,比如:出现的位置、出现的次数、文本自身的长度等等。

等级越高,出现的位置就越靠前,在我们生活中使用的搜索引擎(例如百度、google等)进行搜索东西的时候,我相信也是按照这样的逻辑来出现结果,当然除了百度公司收了别人钱把不匹配的内容人为的放在更前面。

使用查询扩展:with query expansion

前面介绍的只是普通的全文本搜索。

但是,我们在生活中常常有更严格的要求,例如,我希望搜索 的内容包括MySQL字符串,你还想得到与MySQL相关的内容(即使没有出现MySQL字眼),应该怎么来做呢??

这就需要我们使用查询扩展了。

用法 :在against(关键字 with query expansion) 即可 

从结果可以看出,当我们使用了查询扩展之后,就得到了更多相关的内容,即使这些内容不包括MySQL字眼。

至于MySQL是如何根据MySQL来得到与之相关的关键字,目前我还不清楚。

布尔文本搜索

MySQL支持全文本搜索的另外一种形式,称为布尔方式。以布尔方式,可以提供如下内容的细节:

  • 要匹配的词;
  • 要排斥的词、
  • 排列提示(指定某些词比其他词更重要,更重要的词等级更高)
  • 表达式分组。

要说明的是:即使没有fulltext索引也可以使用,只是速度相当相当的慢。

为显示 in boolean mode的作用,以一个简单的例子来进行说明。

select * from test_text where match(content) against('MySQL -interesting' in boolean mode);//返回必须包含MySQL不能包含interesting内容的数据。

关于全文本布尔操作符,见下表(来源于:《MySQL必知必会》这本书)

关于全文本布尔操作符的具体使用实例,与上面的例子类似,这里不在进行具体介绍。

全文本搜索的使用说明

1、MySQL带有一个内建的非用词列表。这些词在索引全文本数据时总是被忽略。如果需要,可以覆盖这个列表。

2、许多词出现的频率很高,搜索他们没有用处(因为返回太多的结果)。因此,MySQL规定了一条50%规则,如果一个词出现在50%以上的行中,则将它作为一个非用词忽略。50%规则不用于in boolean mode.

3、如果表中的数据的行数小于3行,则全文本搜索不返回结果。因此每个词要么不出现,出现就至少为50%。

4、忽略词中的单引号。例如:don’t 索引为dont。

mysql 文本搜索的更多相关文章

  1. 【转】MYSQL入门学习之三:全文本搜索

    转载地址:http://www.2cto.com/database/201212/173873.html 一.理解全文本搜索   www.2cto.com   1.MyISAM支持全文本搜索,而Inn ...

  2. MySQL(十)操纵表及全文本搜索

    一.创建表 MySQL不仅用于表数据操作,还可以用来执行数据库和表的所有操作,包括表本身的创建和处理. 创建表一般有如下两种方式: ①使用具有交互式创建和管理表的工具: ②直接使用MySQL语句操纵表 ...

  3. MySQL全文本搜索

    启用全文本搜索支持 create table text( -> id int not null auto_increment, -> texts text null, -> prim ...

  4. 《mysql必知必会》笔记2(子查询、联接、组合查询、全文本搜索)

    十四:使用子查询 1:子查询是嵌套在其他查询中的查询. 2:需要列出订购TNT2的所有客户信息,需要下面几步: a:从orderitems表中检索出包含物品TNT2的所有订单号: b:根据上一步得出的 ...

  5. MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持

    背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.1 ...

  6. mysql 全文搜索 FULLTEXT

    到 3.23.23 时,MySQL 开始支持全文索引和搜索.全文索引在 MySQL 中是一个 FULLTEXT 类型索引.FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE ...

  7. MySQL全文搜索

    http://www.yiibai.com/mysql/full-text-search.html 在本节中,您将学习如何使用MySQL全文搜索功能. MySQL全文搜索提供了一种实现各种高级搜索技术 ...

  8. Nebula 基于 ElasticSearch 的全文搜索引擎的文本搜索

    本文首发于 Nebula Graph 公众号 NebulaGraphCommunity,Follow 看大厂图数据库技术实践. 1 背景 Nebula 2.0 中已经支持了基于外部全文搜索引擎的文本查 ...

  9. MySQL 全文搜索支持

    MySQL 全文搜索支持 从MySQL 4.0以上 myisam引擎就支持了full text search 全文搜索,在一般的小网站或者blog上可以使用这个特性支持搜索. 那么怎么使用了,简单看看 ...

随机推荐

  1. 服务追踪数据使用 RabbitMQ 进行采集 + 数据存储使用 Elasticsearch + 数据展示使用 Kibana

    服务追踪数据使用 RabbitMQ 进行采集 + 数据存储使用 Elasticsearch + 数据展示使用 Kibana https://www.cnblogs.com/xishuai/p/elk- ...

  2. kibana和ElasticSearch的信息查询检索

    使用kibana来进行ElasticSearch的信息查询检索 大家经常会听到使用ELK搭建日志管理平台.完成日志聚合检索的功能,那么这个平台到底是个什么概念,怎么搭建,怎么使用呢? ELK包括Ela ...

  3. Python数据分析(二)pandas缺失值处理

    import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e' ...

  4. DataTable定义

    DataTable是一个临时保存数据的网格虚拟表(表示内存中数据的一个表.).DataTable是ADO dot net 库中的核心对象.它可以被应用在 VB 和 ASP 上.它无须代码就可以简单的绑 ...

  5. [Leetcode] search a 2d matrix 搜索二维矩阵

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  6. WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程

    今天我们继续学习WCF分布式开发步步为赢系列的12节:WCF事务机制(Transaction)和分布式事务编程.众所周知,应用系统开发过程中,事务是一个重要的概念.它是保证数据与服务可靠性的重要机制. ...

  7. 如何在plsql/developer的命令窗口执行sql脚本

    在plsql/developer的命令窗口执行sql脚本的命令是@+路径 示例如下: 第一步:在C:\Users\linsenq\Desktop目录下新建一个脚本文件: test.sql test.s ...

  8. oracle的sequece的使用(主键自增长)

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  9. scala(一种静态语言)

    语法: 关键字 val(表示:值) 不可变 ex: val a:Int=1   或者   val a=1(会自动识别类型,无基本类与包装类之分) 输出:a:Int=1 关键字var ex: var a ...

  10. CSS中background-position使用技巧

    一.background-position:left top; 背景图片的左上角和容器(container)的左上角对齐,超出的部分隐藏.等同于 background-position:0,0;也等同 ...