10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 36.3 mb
PDF (A4)- 36.4 mb
PDF (RPM)- 35.6 mb
HTML下载(TGZ)- 9.4 mb
HTML下载(Zip)- 9.4 mb
HTML下载(RPM)- 8.1 mb
手册页(TGZ)- 235.5 kb
手册页(Zip)- 347.0 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

12.10.1自然语言全文检索

在自然语言模式下修饰符,匹配()函数对字符串执行自然语言搜索文本集合.类中包含的一个或多个列的集合全文索引。搜索字符串作为参数给出对().对于表中的每一行,匹配()返回一个相关值;中指定的列中搜索字符串与该行中的文本之间的相似性度量匹配()列表。

mysql> CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body)) ENGINE=InnoDB;查询OK, 0 rows affected(0.08秒)mysql> INSERT INTO articles (title,body) VALUES (' mysql教程','DBMS代表数据库…'),('如何很好地使用mysql ','在你经历了一个…'),('优化mysql ','在这个教程中我们展示…'),('1001个mysql技巧','1. mysql ')。不要以root用户运行mysqld。2. ...'), ('MySQL vs. YourSQL','在下面的数据库比较中…'),('MySQL安全','正确配置时,MySQL…');查询OK, 6行影响(0.01秒)记录:6重复:0警告:0 mysql> SELECT * FROM articles WHERE MATCH(标题,正文)AGAINST('数据库'在自然语言模式);+----+-------------------+------------------------------------------+ | id | |头衔的身体  | +----+-------------------+------------------------------------------+ | 1 | | DBMS代表数据库MySQL教程……| | 5 | MySQL vs. YourSQL |在下面的数据库比较中…| +----+-------------------+------------------------------------------+ 2行集(0.00秒)

默认情况下,搜索不区分大小写。若要执行区分大小写的全文搜索,请对索引列使用二进制排序规则。属性的列latin1的字符集可以指定一个排序规则latin1_bin使全文搜索时区分大小写。

匹配()用于在哪里子句,如前面的示例中所示,返回的行首先自动按照最高相关性排序。相关值是非负的浮点数。零相关性意味着没有相似性。相关性是根据行(文档)中的字数、行中惟一单词的数量、集合中的单词总数以及包含特定单词的行数计算的。

请注意

这个词文档可以与术语互换使用,这两个项都指向行中被索引的部分。这个词集合引用已索引的列并包含所有行。

为了简单地统计匹配,你可以使用这样的查询:

mysql> SELECT COUNT(*) FROM article WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE);+----------+ | 数 (*) | +----------+ | 2  | +----------+ 1行集(0.00秒)

你可能会发现这样重写查询会更快:

mysql> SELECT COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL)) AS COUNT FROM articles;+-------+ | 数  | +-------+ | 2  | +-------+ 1行集(0.03秒)

第一个查询做一些额外的工作(根据相关性对结果排序),但也可以使用基于的索引查找在哪里条款。如果搜索匹配的行很少,索引查找可能会使第一个查询更快。第二个查询执行全表扫描,如果搜索词出现在大多数行中,这可能比索引查找快。

类中命名的列对于自然语言全文搜索匹配()函数中必须包含相同的列全文索引您的表。中命名的列匹配()函数(标题而且身体)与定义中的名称相同文章表的全文索引。搜索标题身体分开,你会创建单独的全文每个列的索引。

您还可以执行布尔搜索或使用查询展开进行搜索。中描述了这些搜索类型匹配()子句,因为索引不能跨多个表。为MyISAM表,布尔搜索可以在没有索引的情况下完成(尽管速度较慢),在这种情况下,可以从多个表中命名列。

前面的示例是一个基本的示例,说明如何使用匹配()函数,其中按相关性递减的顺序返回行。下一个示例演示如何显式检索相关值。返回的行没有排序,因为选择声明不包括任何内容在哪里也不命令条款:

mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score FROM articles;+----+---------------------+ | id |得分  | +----+---------------------+ | 1 | 0.22764469683170319 | | 2 | 0 | | 3 | 0.22764469683170319 | | 4 | 0 | | 5 | 0 | | 6 | 0  | +----+---------------------+ 6行集(0.00秒)

下面的例子更加复杂。该查询返回相关性值,并按相关性递减的顺序对行进行排序。要实现此结果,请指定匹配()两次:一次在选择列表和曾经在在哪里条款。这不会引起额外的开销,因为MySQL优化器会注意到这两个匹配()调用是相同的,并且只调用一次全文搜索代码。

mysql> SELECT id, body, MATCH(标题,正文)AGAINST('安全隐患运行mysql作为根'在自然语言模式)作为得分从文章WHERE MATCH(标题,正文)AGAINST('安全隐患运行mysql作为根'在自然语言模式);+----+-------------------------------------+-----------------+ | id身体| |得分  | +----+-------------------------------------+-----------------+ | 4 | 1。不要以root用户运行mysqld。2 .……| 1.5219271183014 | | 6 |如果配置正确,MySQL…| 1.3114095926285  | +----+-------------------------------------+-----------------+ 2行集(0.00秒)

用双引号括起来的短语()字符只匹配包含短语的行字面上,就像打字一样.全文引擎将短语拆分为单词,并在全文索引的词。非单词字符不需要精确匹配:短语搜索只需要匹配包含与短语完全相同的单词并且顺序相同。例如,“测试“匹配“测试,“.如果短语不包含索引中的单词,则结果为空。例如,如果所有单词都是停止词或小于索引单词的最小长度,则结果为空。

MySQL全文实现将任何真实的单词字符序列(字母、数字和下划线)视为单词。该序列还可以包含撇号(),但不能超过一组。这意味着aaa 'bbb被视为一个词,但是aaa”bbb被视为两个字。符号去掉单词开头或结尾的撇号全文解析器;“aaa 'bbb”会被解析为aaa 'bbb

内置的全文解析器通过查找某些分隔符来确定单词的开始和结束位置;例如,(空间),(逗号)(时期)。如果单词没有用分隔符分隔(例如在中文中),则内置的全文解析器无法确定单词的开始或结束位置。能够将这些语言中的单词或其他索引术语添加到全文索引,使用内置的全文解析器中,必须对它们进行预处理,以便用任意的分隔符分隔它们。或者,您也可以创建全文使用ngram解析器插件(用于中文、日语或韩语)或MeCab解析器插件(用于日语)创建索引。

可以编写一个插件来替换内置的全文解析器。详细信息请参见MySQL插件API.有关解析器插件的示例源代码,请参见插件/全文MySQL源代码发行版的目录。

在全文搜索中,有些词会被忽略:

  • 任何太短的单词都会被忽略。全文搜索所找到的单词的默认最小长度为三个字符InnoDB搜索索引,或者四个字符MyISAM.你可以在创建索引之前通过设置一个配置选项来控制截断:innodb_ft_min_token_size配置选项InnoDB搜索索引,或ft_min_word_lenMyISAM

    请注意

    这种行为不适用于全文使用ngram解析器的索引。对于ngram解析器,令牌长度由ngram_token_size选择。

  • 停止词列表中的单词将被忽略。一个停止词是一个词,如一些这是如此普遍,以至于它被认为没有语义价值。有一个内置的停止词列表,但它可以被用户定义的列表覆盖。的停止字列表和相关配置选项不同InnoDB搜索索引和MyISAM的人。停止字处理由配置选项控制innodb_ft_enable_stopwordinnodb_ft_server_stopword_table,innodb_ft_user_stopword_tableInnoDB搜索索引,以及ft_stopword_fileMyISAM的人。

看到

对于非常小的表,单词分布并不能充分反映它们的语义值,并且这个模型有时可能会产生奇怪的搜索索引结果MyISAM表。例如,虽然这个词MySQL的每一行文章表中显示的搜索词MyISAM搜索索引没有结果:

mysql> SELECT * FROM article WHERE MATCH(标题,正文)AGAINST (' mysql '在自然语言模式);空集(0.00秒)

搜索结果为空,因为单词MySQL出现在至少50%的行中,因此被有效地视为一个停止词。这种过滤技术更适合于大型数据集(您可能不希望结果集从1GB表中每隔两行返回一次),而不适用于小型数据集(在小型数据集中,对于流行术语可能会导致较差的结果)。

当您第一次尝试全文搜索以了解其工作原理时,50%的阈值可能会让您感到惊讶InnoDB更适合全文搜索实验的表格。如果你创建一个MyISAM表格中只插入一两行文本,文本中的每个单词至少出现在50%的行中。因此,在表包含更多行之前,搜索不会返回任何结果。需要绕过50%限制的用户可以在上面构建搜索索引InnoDB表,或使用布尔搜索模式解释