全文搜索功能

目录

自然语言全文搜索

布尔全文搜索

具有查询扩展的全文本搜索

全文停用词

InnoDB搜索索引的停用词

MyISAM搜索索引的停用词

全文限制


MATCH (col1,col2,...) AGAINST (expr [search_modifier])

search_modifier:
  {
       IN NATURAL LANGUAGE MODE
     | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
     | IN BOOLEAN MODE
     | WITH QUERY EXPANSION
  }

MySQL支持全文索引和搜索:

  • MySQL 中的 full-text 索引是FULLTEXT类型的索引。
  • Full-text 索引只能与InnoDB或MyISAM 数据表一起使用,并且只能为CHAR, VARCHAR或 TEXT列。
  • 从 MySQL 5.7.6 开始,MySQL提供了一个支持中文,日文和韩文(CJK)的 built-in full-text ngram 解析器,以及一个可安装的日文版 MeCab full-text 解析器插件。第12.9.8节“ ngram全文分析器”和 第12.9.9节“ MeCab全文分析器插件”中概述了分析差异。
  • 创建 table 时可以在CREATE TABLE语句中给出FULLTEXT索引定义,或者稍后使用 ALTER TABLE或 CREATE INDEX添加FULLTEXT索引定义。
  • 对于大型数据集,将数据加载到没有FULLTEXT索引的 table 然后在此之后创建索引要快得多,而不是将数据加载到具有现有FULLTEXT索引的 table 中。

使用MATCH() ... AGAINST语法执行全文搜索 。 MATCH()以逗号分隔的列表命名要搜索的列。 AGAINST接受要搜索的字符串和可选修饰符,以指示要执行的搜索类型。搜索字符串必须是在查询评估期间恒定的字符串值。例如,表列,因为每行的表列可以不同

全文搜索分为三种类型:

  • 自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。除双引号(“)字符外,没有特殊的运算符。禁用词列表适用,有关停用词列表的更多信息,请参见第12.9.4节“全文停用词 ”。

如果指定了IN NATURAL LANGUAGE MODE修饰符或未给出修饰符,则全文搜索是自然语言搜索 。有关更多信息,请参见 第12.9.1节“自然语言全文本搜索”。

  • 布尔搜索使用特殊查询语言的规则解释搜索字符串。该字符串包含要搜索的单词。它还可以包含指定要求的运算符,例如,匹配行中必须存在或不存在一个单词,或者其权重应高于或低于平常。某些常见单词(停用词)将从搜索索引中省略,并且如果出现在搜索字符串中则不匹配。该IN BOOLEAN MODE修饰符指定一个布尔搜索。有关更多信息,请参见 第12.9.2节“布尔全文搜索”。
  • 查询扩展搜索是对自然语言搜索的修改。搜索字符串用于执行自然语言搜索。然后,将搜索返回的最相关行中的单词添加到搜索字符串中,然后再次执行搜索。该查询返回第二个搜索中的行。该IN NATURAL LANGUAGE MODE WITH QUERY EXPANSIONWITH QUERY EXPANSION修改指定的查询扩展搜索。有关更多信息,请参见 第12.9.3节“带查询扩展的全文本搜索”。

myisam_ftdump工具转储MyISAM全文索引的内容。这对于调试全文查询可能会有所帮助。

自然语言全文搜索

默认情况下或使用IN NATURAL LANGUAGE MODE修饰符,MATCH() function 对文本集合执行 string 的自然语言搜索。集合是FULLTEXT索引中包含的一个或多个列的集合。搜索 string 作为AGAINST()的参数给出。对于 table 中的每一行,MATCH()返回一个相关性 value;也就是说,搜索 string 与MATCH()列表中指定的列中该行中的文本之间的相似性度量。

mysql> CREATE TABLE articles (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
          title VARCHAR(200),
          body TEXT,
          FULLTEXT (title,body)
        ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO articles (title,body) VALUES
        ('MySQL Tutorial','DBMS stands for DataBase ...'),
        ('How To Use MySQL Well','After you went through a ...'),
        ('Optimizing MySQL','In this tutorial we will show ...'),
        ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
        ('MySQL vs. YourSQL','In the following database comparison ...'),
        ('MySQL Security','When configured properly, MySQL ...');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles
        WHERE MATCH (title,body)
        AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

默认情况下,搜索以不区分大小写的方式执行。要执行区分大小写的全文本搜索,请对索引列使用二进制排序规则。例如,latin1可以为使用字符集的列分配一个排序规则,latin1_bin以使其对全文搜索区分大小写。

当在WHERE子句中使用MATCH()时,如前面所示的 example,返回的行将首先自动排序,具有最高的相关性。相关性值是非负 floating-point numbers。零相关意味着没有相似性。相关性是根据行(文档)中的单词数,行中唯一单词的数量,集合中的单词总数以及包含特定单词的行数计算的。

注意

术语“ 文档 ”( “document” )可以与术语“ 行 ”( “row”)互换使用,并且两个术语均指行的索引部分。术语“ 集合 ”( “collection”) 是指索引的列并涵盖所有行。

要简单地计算匹配数,您可以使用如下查询:

mysql> SELECT COUNT(*) FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----------+
| COUNT(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

您可能会发现重写查询更快,如下所示:

mysql> SELECT
    COUNT(IF(MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE), 1, NULL))
    AS count
    FROM articles;
+-------+
| count |
+-------+
|     2 |
+-------+
1 row in set (0.03 sec)

第一个查询做了一些额外的工作(按相关性对结果进行排序),但也可以使用基于WHERE子句的索引查找 。如果搜索匹配几行,索引查找可能会使第一个查询更快。第二个查询执行全表扫描,如果大多数行中都存在搜索词,它可能比索引查找要快。

对于自然语言全文搜索,MATCH()函数中命名的列必须与表中某些FULLTEXT索引中包含的列相同。对于前面的查询,请注意MATCH()函数(titlebody)中命名的列与articleFULLTEXT 索引定义中命名的列相同 。要分别搜索title或 body,您将为每列创建单独的FULLTEXT索引。

您还可以执行布尔搜索或带有查询扩展的搜索。第12.9.2节“布尔型全文本搜索”和 第12.9.3节“具有查询扩展的全文本搜索”中介绍了这些搜索类型 。

使用索引的全文搜索只能在MATCH() 子句中的单个表中命名列,因为索引不能跨越多个表。对于 MyISAM表,可以在没有索引的情况下进行布尔搜索(尽管速度较慢),在这种情况下,可以从多个表中命名列。

前面的示例是一个基本图解,它显示了如何使用MATCH()函数(按相关性递减的顺序返回行)。下一个示例显示如何显式检索相关性值。返回的行没有排序,因为该 SELECT语句既不包含WHERE也不包含 ORDER BY 子句:

mysql> SELECT id, MATCH (title,body)
    AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score
    FROM articles;
+----+---------------------+
| id | score               |
+----+---------------------+
|  1 | 0.22764469683170319 |
|  2 |                   0 |
|  3 | 0.22764469683170319 |
|  4 |                   0 |
|  5 |                   0 |
|  6 |                   0 |
+----+---------------------+
6 rows in set (0.00 sec)

以下示例更为复杂。查询返回相关性值,并且还按相关性递减的顺序对行进行排序。要获得此结果,请指定 MATCH()两次:一次在 SELECT列表中,一次在 WHERE子句中。这不会造成额外的开销,因为MySQL优化器注意到这两个 MATCH()调用是相同的,并且仅调用一次全文搜索代码。

mysql> SELECT id, body, MATCH (title,body) AGAINST
    ('Security implications of running MySQL as root'
    IN NATURAL LANGUAGE MODE) AS score
    FROM articles WHERE MATCH (title,body) AGAINST
    ('Security implications of running MySQL as root'
    IN NATURAL LANGUAGE MODE);
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)

包含在双引号(")字符中的短语仅与按字面意义包含按其键入的行匹配。全文引擎将短语分解为单词,并在FULLTEXT索引中搜索单词。非单词字符不必完全匹配:短语搜索仅要求匹配项包含与短语完全相同的单词,并且顺序相同。例如,"test phrase"matchs "test, phrase"。如果该短语不包含索引中的单词,则结果为空。例如,如果所有单词都是停用词或比索引单词的最小长度短,则结果为空。

MySQL FULLTEXT实现将任何真单词字符(字母,数字和下划线)序列视为一个单词。该序列也可以包含撇号('),但不能超过一行。这意味着aaa'bbb被视为一个单词,但aaa''bbb被视为两个单词。FULLTEXT解析器将单词开头或结尾的撇号删除; 'aaa'bbb'将被解析为 aaa'bbb

内置的FULLTEXT解析器通过查找某些定界符来确定单词的开头和结尾。 for example,   (space), , (comma), and . (period)句号. 如果单词之间没有用定界符分隔(例如,中文),则内置FULLTEXT解析器无法确定单词的开始或结束位置。为了能够将这些语言中的单词或其他索引术语添加到使用内置FULLTEXT解析器的FULLTEXT索引中 ,您必须对其进行预处理,以使它们之间可以由任意定界符分隔。或者,您可以创建FULLTEXT 使用ngram解析器插件(适用于中文,日语或韩语)或MeCab解析器插件(适用于日语)建立索引。

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

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

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

此行为不适用于 FULLTEXT使用ngram解析器的索引。对于ngram解析器,令牌长度由ngram_token_size 选项定义。

  • 停用词列表中的单词将被忽略。停用词是诸如“ the ”“ some ”之类的词,它很普遍以至于它被认为具有零语义值。有一个内置的停用词列表,但是可以被用户定义的列表覆盖。InnoDB搜索索引和 MyISAM搜索索引的停用词列表和相关配置选项不同。停用词处理由配置选项来控制 innodb_ft_enable_stopword, innodb_ft_server_stopword_table和 innodb_ft_user_stopword_table 用于InnoDB搜索的索引,并且 ft_stopword_file对于 MyISAM那些。

请参见第12.9.4节“全文停用词”以查看默认停用词列表以及如何更改它们。可以如第12.9.6节“微调MySQL全文搜索”中所述更改默认的最小字长 。

集合中和查询中的每个正确单词都将根据其在集合或查询中的重要性进行加权。因此,存在于许多文档中的单词具有较低的权重,因为它在此特定集合中具有较低的语义值。相反,如果单词很少见,则其权重较高。单词的权重被组合以计算行的相关性。这项技术最适合大型收藏。

MyISAM局限性

对于很小的表,单词分布不能充分反映其语义价值,并且此模型有时可能会为MyISAM表上的搜索索引产生奇怪的结果 。例如,尽管在前面显示的表的每一行中都有 单词“ MySQL ”,但是articlesMyISAM搜索索引中搜索该单词不会产生结果:

mysql> SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('MySQL' IN NATURAL LANGUAGE MODE);
Empty set (0.00 sec)

搜索结果为空,因为至少有50%的行中包含单词 “ MySQL ”,因此有效地将其视为停用词。这种过滤技术更适合于大型数据集,在小型数据集中,您可能不希望结果集从1GB表中返回第二行,而在小型数据集中,它可能导致流行术语的结果不佳。

当您首次尝试全文搜索以查看其工作原理时,50%的阈值可能会让您感到惊讶,并使 InnoDB表格更适合进行全文搜索的实验。如果创建 MyISAM表并仅在其中插入一两行文本,则文本中的每个单词至少出现在50%的行中。结果,在表包含更多行之前,没有搜索返回任何结果。需要绕过50%限制的用户可以在InnoDB表上建立搜索索引 ,或使用第12.9.2节“布尔全文本搜索”中说明的布尔搜索模式。

 

 

布尔全文搜索

MySQL可以使用IN BOOLEAN MODE修饰符执行布尔型全文本搜索 。使用此修饰符,某些字符在搜索字符串中单词的开头或结尾具有特殊含义。在以下查询中, +-运算符指示必须存在或不存在一个词,匹配才会发生。因此,查询将检索所有包含单词“ MySQL ”但 包含单词 “ YourSQL ”的行

mysql> SELECT * FROM articles WHERE MATCH (title,body)
    AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
+----+-----------------------+-------------------------------------+
| id | title                 | body                                |
+----+-----------------------+-------------------------------------+
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
|  2 | How To Use MySQL Well | After you went through a ...        |
|  3 | Optimizing MySQL      | In this tutorial we will show ...   |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
|  6 | MySQL Security        | When configured properly, MySQL ... |
+----+-----------------------+-------------------------------------+
注意

在实现此功能时,MySQL使用了有时称为隐式布尔逻辑的方法,其中

  • + 代表 AND

  • - 代表 NOT

  • 没有运算符 ]暗含 OR

 

暂略,更多内容见,12.9.2布尔全文搜索

具有查询扩展的全文本搜索

全文搜索支持查询扩展(尤其是其变体“ 盲查询扩展 ”)。当搜索短语太短时,这通常很有用,这通常意味着用户依赖于全文搜索引擎所缺乏的隐含知识。例如,搜索“ 数据库 ”的用户 实际上可能意味着 “ MySQL ”“ Oracle ”“ DB2 ”“ RDBMS ”都是应与“ 数据库 ”匹配的短语 并且也应该返回。这就是隐含的知识。

通过添加WITH QUERY EXPANSIONIN NATURAL LANGUAGE MODE WITH QUERY EXPANSION跟随搜索短语,可以启用盲查询扩展(也称为自动相关性反馈)。它通过执行两次搜索来工作,其中第二次搜索的搜索短语是原始搜索短语,并与来自第一次搜索的少数几个最相关的文档连接在一起。因此,如果这些文档之一包含单词 “ database ”和单词“ MySQL ”,则第二次搜索将查找包含单词“ MySQL ”的文档, 即使它们不包含单词 “ database ”。以下示例显示了这种差异:

mysql> SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' IN NATURAL LANGUAGE MODE);
+----+-------------------+------------------------------------------+
| id | title             | body                                     |
+----+-------------------+------------------------------------------+
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM articles
    WHERE MATCH (title,body)
    AGAINST ('database' WITH QUERY EXPANSION);
+----+-----------------------+------------------------------------------+
| id | title                 | body                                     |
+----+-----------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL     | In the following database comparison ... |
|  1 | MySQL Tutorial        | DBMS stands for DataBase ...             |
|  3 | Optimizing MySQL      | In this tutorial we will show ...        |
|  6 | MySQL Security        | When configured properly, MySQL ...      |
|  2 | How To Use MySQL Well | After you went through a ...             |
|  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ...      |
+----+-----------------------+------------------------------------------+
6 rows in set (0.00 sec)

另一个示例是当用户不确定如何拼写“ Maigret ”时,搜索Georges Simenon的有关Maigret的书 。搜索“ Megre和不情愿的证人 ”仅找到“ Maigret和不情愿的证人 ”,而没有查询扩展。带有查询扩展的搜索会在第二遍查找中找到所有带有单词“ Maigret ”的图书 。

注意

由于盲查询扩展往往会通过返回不相关的文档而显着增加干扰,因此仅在搜索短语较短时才使用它。

全文停用词

使用服务器字符集和排序规则(character_set_server和 collation_server系统变量的值),加载停用词列表并搜索全文查询 。如果用于全文索引或搜索的停用词文件或列的字符集或排序规则不同于character_set_servercollation_server ,则停用词查找可能会出现错误的命中或遗漏。

停用词查找是否区分大小写取决于服务器排序规则。例如,如果排序规则为latin1_swedish_ci,则查找不区分大小写,而如果排序规则为latin1_general_cslatin1_bin,则查找为 case-sensitive。

InnoDB搜索索引的停用词

InnoDB有一个相对短的默认停用词列表,因为技术,文学和其他来源的文档经常使用短词作为关键字或重要短语。例如,您可能搜索 “ 是或不是 ”,并期望获得明智的结果,而不是忽略所有这些词。

要查看默认InnoDB停用词列表,请查询该 INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD 表。

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+-------+
| value |
+-------+
| a     |
| about |
| an    |
| are   |
| as    |
| at    |
| be    |
| by    |
| com   |
| de    |
| en    |
| for   |
| from  |
| how   |
| i     |
| in    |
| is    |
| it    |
| la    |
| of    |
| on    |
| or    |
| that  |
| the   |
| this  |
| to    |
| was   |
| what  |
| when  |
| where |
| who   |
| will  |
| with  |
| und   |
| the   |
| www   |
+-------+
36 rows in set (0.00 sec)

要为所有InnoDB表定义自己的停用词列表 ,请定义与该表具有相同结构的INNODB_FT_DEFAULT_STOPWORD表,并使用停用词填充该 表,并将 innodb_ft_server_stopword_table 选项的值设置为db_name/table_name形式的值, 然后再创建全文索引。停用词表必须只有一个名为valueVARCHAR列。以下示例演示了如何为InnoDB表创建和配置新的全局停用词。 

-- Create a new stopword table

mysql> CREATE TABLE my_stopwords(value VARCHAR(30)) ENGINE = INNODB;
Query OK, 0 rows affected (0.01 sec)

-- Insert stopwords (for simplicity, a single stopword is used in this example)

mysql> INSERT INTO my_stopwords(value) VALUES ('Ishmael');
Query OK, 1 row affected (0.00 sec)

-- Create the table

mysql> CREATE TABLE opening_lines (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
opening_line TEXT(500),
author VARCHAR(200),
title VARCHAR(200)
) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)

-- Insert data into the table

mysql> INSERT INTO opening_lines(opening_line,author,title) VALUES
('Call me Ishmael.','Herman Melville','Moby-Dick'),
('A screaming comes across the sky.','Thomas Pynchon','Gravity\'s Rainbow'),
('I am an invisible man.','Ralph Ellison','Invisible Man'),
('Where now? Who now? When now?','Samuel Beckett','The Unnamable'),
('It was love at first sight.','Joseph Heller','Catch-22'),
('All this happened, more or less.','Kurt Vonnegut','Slaughterhouse-Five'),
('Mrs. Dalloway said she would buy the flowers herself.','Virginia Woolf','Mrs. Dalloway'),
('It was a pleasure to burn.','Ray Bradbury','Fahrenheit 451');
Query OK, 8 rows affected (0.00 sec)
Records: 8  Duplicates: 0  Warnings: 0

-- Set the innodb_ft_server_stopword_table option to the new stopword table

mysql> SET GLOBAL innodb_ft_server_stopword_table = 'test/my_stopwords';
Query OK, 0 rows affected (0.00 sec)

-- Create the full-text index (which rebuilds the table if no FTS_DOC_ID column is defined)

mysql> CREATE FULLTEXT INDEX idx ON opening_lines(opening_line);
Query OK, 0 rows affected, 1 warning (1.17 sec)
Records: 0  Duplicates: 0  Warnings: 1

通过查询 INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE中的单词,验证是否未显示指定的停用词('Ishmael')。

注意

默认情况下,长度少于3个字符或长度大于84个字符的单词不会出现在 InnoDB全文搜索索引中。可以使用innodb_ft_max_token_size 和 innodb_ft_min_token_size 变量配置最大和最小字长值 。此默认行为不适用于ngram解析器插件。ngram令牌大小由该ngram_token_size选项定义 。

mysql> SET GLOBAL innodb_ft_aux_table='test/opening_lines';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT word FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE LIMIT 15;
+-----------+
| word      |
+-----------+
| across    |
| all       |
| burn      |
| buy       |
| call      |
| comes     |
| dalloway  |
| first     |
| flowers   |
| happened  |
| herself   |
| invisible |
| less      |
| love      |
| man       |
+-----------+
15 rows in set (0.00 sec)

要逐个表创建停用词列表,请创建其他停用词表,并使用该 innodb_ft_user_stopword_table 选项指定要使用的停用词表,然后再创建全文索引。

MyISAM搜索索引的停用词

停止字文件被加载并使用搜索 latin1,如果 character_set_server是 ucs2utf16, utf16le,或utf32

要覆盖MyISAM表的默认停用词列表,请设置ft_stopword_file系统变量。(请参见第5.1.7节“服务器系统变量”。)变量值应为包含停用词列表的文件的路径名,或为禁用停用词过滤的空字符串。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中查找文件。更改此变量的值或停用词文件的内容之后,请重新启动服务器并重建FULLTEXT索引。

停用词列表是自由格式的,使用任何非字母数字字符(例如换行符,空格或逗号)分隔停用词。例外情况是下划线字符(_)和单撇号(')被视为单词的一部分。停用词列表的字符集是服务器的默认字符集。请参见 第10.3.2节“服务器字符集和排序规则”。

以下列表显示了MyISAM搜索索引的默认停用词 。在MySQL源代码发行版中,您可以在storage/myisam/ft_static.c文件中找到此列表 。

a's           able          about         above         according
accordingly   across        actually      after         afterwards
again         against       ain't         all           allow
allows        almost        alone         along         already
also          although      always        am            among
amongst       an            and           another       any
anybody       anyhow        anyone        anything      anyway
anyways       anywhere      apart         appear        appreciate
appropriate   are           aren't        around        as
aside         ask           asking        associated    at
available     away          awfully       be            became
because       become        becomes       becoming      been
before        beforehand    behind        being         believe
below         beside        besides       best          better
between       beyond        both          brief         but
by            c'mon         c's           came          can
can't         cannot        cant          cause         causes
certain       certainly     changes       clearly       co
com           come          comes         concerning    consequently
consider      considering   contain       containing    contains
corresponding could         couldn't      course        currently
definitely    described     despite       did           didn't
different     do            does          doesn't       doing
don't         done          down          downwards     during
each          edu           eg            eight         either
else          elsewhere     enough        entirely      especially
et            etc           even          ever          every
everybody     everyone      everything    everywhere    ex
exactly       example       except        far           few
fifth         first         five          followed      following
follows       for           former        formerly      forth
four          from          further       furthermore   get
gets          getting       given         gives         go
goes          going         gone          got           gotten
greetings     had           hadn't        happens       hardly
has           hasn't        have          haven't       having
he            he's          hello         help          hence
her           here          here's        hereafter     hereby
herein        hereupon      hers          herself       hi
him           himself       his           hither        hopefully
how           howbeit       however       i'd           i'll
i'm           i've          ie            if            ignored
immediate     in            inasmuch      inc           indeed
indicate      indicated     indicates     inner         insofar
instead       into          inward        is            isn't
it            it'd          it'll         it's          its
itself        just          keep          keeps         kept
know          known         knows         last          lately
later         latter        latterly      least         less
lest          let           let's         like          liked
likely        little        look          looking       looks
ltd           mainly        many          may           maybe
me            mean          meanwhile     merely        might
more          moreover      most          mostly        much
must          my            myself        name          namely
nd            near          nearly        necessary     need
needs         neither       never         nevertheless  new
next          nine          no            nobody        non
none          noone         nor           normally      not
nothing       novel         now           nowhere       obviously
of            off           often         oh            ok
okay          old           on            once          one
ones          only          onto          or            other
others        otherwise     ought         our           ours
ourselves     out           outside       over          overall
own           particular    particularly  per           perhaps
placed        please        plus          possible      presumably
probably      provides      que           quite         qv
rather        rd            re            really        reasonably
regarding     regardless    regards       relatively    respectively
right         said          same          saw           say
saying        says          second        secondly      see
seeing        seem          seemed        seeming       seems
seen          self          selves        sensible      sent
serious       seriously     seven         several       shall
she           should        shouldn't     since         six
so            some          somebody      somehow       someone
something     sometime      sometimes     somewhat      somewhere
soon          sorry         specified     specify       specifying
still         sub           such          sup           sure
t's           take          taken         tell          tends      
th            than          thank         thanks        thanx
that          that's        thats         the           their
theirs        them          themselves    then          thence
there         there's       thereafter    thereby       therefore
therein       theres        thereupon     these         they
they'd        they'll       they're       they've       think
third         this          thorough      thoroughly    those
though        three         through       throughout    thru
thus          to            together      too           took
toward        towards       tried         tries         truly
try           trying        twice         two           un
under         unfortunately unless        unlikely      until
unto          up            upon          us            use
used          useful        uses          using         usually
value         various       very          via           viz
vs            want          wants         was           wasn't
way           we            we'd          we'll         we're
we've         welcome       well          went          were
weren't       what          what's        whatever      when
whence        whenever      where         where's       whereafter
whereas       whereby       wherein       whereupon     wherever
whether       which         while         whither       who
who's         whoever       whole         whom          whose
why           will          willing       wish          with
within        without       won't         wonder        would
wouldn't      yes           yet           you           you'd
you'll        you're        you've        your          yours
yourself      yourselves    zero

全文限制

  • 仅对InnoDB和 MyISAM表 支持全文搜索 。
  • 分区表不支持全文搜索。请参见第22.6节“分区的限制和限制”。
  • 全文搜索可用于大多数多字节字符集。例外是,对于Unicode, utf8可以使用字符集,但不能使用ucs2字符集。尽管 无法使用 ucs2列上的FULLTEXT索引,但是您可以在没有此类索引的ucs2列上执行IN BOOLEAN MODE搜索 。

utf8的备注也适用于utf8mb4ucs2的备注也适用于utf16utf16leutf32

  • 表意语言(例如中文和日语)没有单词定界符。因此,内置的全文分析器无法确定单词在这些语言和其他此类语言中的开始和结束位置

提供了与InnoDBand MySIAM 表一起使用的基于字符的ngram全文语法分析器,该语法支持中文,日语和韩语(CJK),以及基于单词的MeCab语法分析器插件,该插件支持日语。

  • 尽管支持在单个表中使用多个字符集,但是FULLTEXT索引中的所有列 必须使用相同的字符集和排序规则。
  • MATCH()列列表必须完全匹配某些FULLTEXT索引定义中的列列表,除非 MATCH()在 MyISAM table.的IN BOOLEAN MODE 模式中,布尔模式搜索可以在非索引列上进行,尽管它们可能很慢。
  • AGAINST()的参数必须是 string value,它在查询 evaluation 期间是常量。例如,这排除了 table 列,因为每行可能不同。
  • FULLTEXT 与非FULLTEXT搜索相比,搜索的 索引提示更为有限。请参见第8.9.4节“索引提示”。
  • 对于InnoDB所有DML操作(INSERT, UPDATE, DELETE)与全文索引以事务处理涉及列提交时间。例如,对于一个INSERT 操作,插入的字符串将被标记化并分解为单个单词。然后在提交事务时将各个单词添加到全文索引表中。结果,全文搜索仅返回已提交的数据。
  • 全文搜索不支持'%'字符。

12.9.1自然语言全文搜索

12.9.2布尔全文搜索

12.9.3具有查询扩展的全文本搜索

12.9.4全文停用词

12.9.5全文限制

12.9.6微调MySQL全文搜索

12.9.7为全文索引添加归类

12.9.8 ngram全文分析器

12.9.9 MeCab全文分析器插件

 

 

 

 

 

 

 

你可能感兴趣的:(#,函数和运算符)