目录
自然语言全文搜索
布尔全文搜索
具有查询扩展的全文本搜索
全文停用词
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支持全文索引和搜索:
FULLTEXT
类型的索引。CHAR
, VARCHAR
或 TEXT
列。MySQL
提供了一个支持中文,日文和韩文(CJK)的 built-in full-text ngram 解析器,以及一个可安装的日文版 MeCab full-text 解析器插件。第12.9.8节“ ngram全文分析器”和 第12.9.9节“ MeCab全文分析器插件”中概述了分析差异。CREATE TABLE
语句中给出FULLTEXT
索引定义,或者稍后使用 ALTER TABLE
或 CREATE INDEX
添加FULLTEXT
索引定义。FULLTEXT
索引的 table 然后在此之后创建索引要快得多,而不是将数据加载到具有现有FULLTEXT
索引的 table 中。使用MATCH() ... AGAINST
语法执行全文搜索 。 MATCH()
以逗号分隔的列表命名要搜索的列。 AGAINST
接受要搜索的字符串和可选修饰符,以指示要执行的搜索类型。搜索字符串必须是在查询评估期间恒定的字符串值。例如,表列,因为每行的表列可以不同
全文搜索分为三种类型:
如果指定了IN NATURAL LANGUAGE MODE
修饰符或未给出修饰符,则全文搜索是自然语言搜索 。有关更多信息,请参见 第12.9.1节“自然语言全文本搜索”。
IN BOOLEAN MODE
修饰符指定一个布尔搜索。有关更多信息,请参见 第12.9.2节“布尔全文搜索”。IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION
或WITH 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()
函数(title
和body
)中命名的列与article
表FULLTEXT
索引定义中命名的列相同 。要分别搜索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/fulltext
MySQL源发行版的 目录。
在全文搜索中,某些单词会被忽略:
InnoDB
搜索索引的三个字符,或MyISAM
的四个字符。您可以通过创建索引之前设置一个配置选项来控制截止: innodb_ft_min_token_size
的配置选项InnoDB
搜索索引,或ft_min_word_len
为MyISAM
。注意此行为不适用于
FULLTEXT
使用ngram解析器的索引。对于ngram解析器,令牌长度由ngram_token_size
选项定义。
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 ”,但是articles
在MyISAM
搜索索引中搜索该单词不会产生结果: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 EXPANSION
或IN 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_server
或collation_server
,则停用词查找可能会出现错误的命中或遗漏。
停用词查找是否区分大小写取决于服务器排序规则。例如,如果排序规则为latin1_swedish_ci
,则查找不区分大小写,而如果排序规则为latin1_general_cs
或latin1_bin
,则查找为 case-sensitive。
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形式
value
的VARCHAR
列。以下示例演示了如何为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
选项指定要使用的停用词表,然后再创建全文索引。
停止字文件被加载并使用搜索 latin1
,如果 character_set_server
是 ucs2
,utf16
, 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
表 支持全文搜索 。utf8
可以使用字符集,但不能使用ucs2
字符集。尽管 无法使用 ucs2
列上的FULLTEXT
索引,但是您可以在没有此类索引的ucs2
列上执行IN BOOLEAN MODE
搜索 。utf8
的备注也适用于utf8mb4
,ucs2
的备注也适用于utf16
,utf16le
和utf32
。
提供了与InnoDB
and 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全文分析器插件