"Stopword" 在 MySQL 中是什么意思?

What does the term "Stopword" mean in MySQL?

我目前正在研究 MySQL 命令,但在对 FULLTEXT 索引使用 "MATCH...AGAINST" 命令时遇到了困难。它 returns 一个 "empty set" 当它反对 "stopword"(在我的例子中是 "and")。

这是我所做的。我正在处理的数据库包含书籍及其作者的列表。我正在尝试 select 标题中包含 "and" 的条目。这是我的列表 'classics' table.

+--------------------+------------------------------+
| author             | title                        |
+--------------------+------------------------------+
| Mark Twain         | The Adventures of Tom Sawyer |
| Jane Austen        | Pride and Prejudice          |
| Charles Darwin     | The Origin of Species        |
| Charles Dickens    | The Old Curiosity Shop       |
| William Shakespear | Romeo and Juliet             |
+--------------------+------------------------------+

这是我写的代码

SELECT author, title FROM classics
WHERE MATCH(author, title) AGAINST('and');

Empty set (0.00 sec)

我期望的结果是 "Pride and Prejudice" 和 "Romeo and Juliet" 而不是 "Empty set (0.00 sec)"。我现在意识到 "and" 是一个停用词。

我的问题是 "stopword" 是什么意思,我怎么知道哪个词是停用词?如果我真的想 select 标题中包含 "and" 的查询,我该怎么办?

您可以在 dev.mysql.com 中查看停用词列表的示例:

To see the default InnoDB stopword list, query the INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD table.

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+-------+
| value |
+-------+
| a     |
| about |

在“The INFORMATION_SCHEMA INNODB_FT_DEFAULT_STOPWORD Table”查看更多信息

glossary defines stopword为:

In a FULLTEXT index, a word that is considered common or trivial enough that it is omitted from the search index and ignored in search queries.
Different configuration settings control stopword processing for InnoDB and MyISAM tables.


要强制全文索引包含三个字母的单词,您需要 (重新启动 mysqld 并重建 table)

My question is What does the "stopword" mean ...

停用词是在 full-text 搜索中作为关键字给出时将被忽略的词。

有关详细信息,请阅读 stopwords 上的维基百科页面。

MySQL 以与正常定义一致的方式使用该术语。

... and how do I know which word is a stopword?

对于 InnoDB tables 你可以查询 INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD table.

对于 MyISAM 搜索索引,停用词是从文件中加载的。可以使用 Java 文件 I/O 在运行时读取文件,但显然无法通过数据库查询访问它。

And what should I do if I really want to select the query which contains "and" in its title?

MySQL 文档解释了如何操作;参见 Section 12.9.4 Full-Text Stopwords。 (这里复制的太详细了。)

我的理解是您需要更改配置并重新启动数据库服务器才能更改停用词。对于 InnoDB tables,您还需要重新生成 table 的 full-text 索引。

这意味着您不能更改每个查询的停用词……如果您打算这样做的话。但是您可以使用 LIKE 显式查询停用词;例如

SELECT author, title FROM classics
WHERE title LIKE '% and %';

该查询可能需要 table 扫描,因此您希望尽可能避免它。

也许你应该这样做:

SELECT author, title FROM classics WHERE title LIKE '% and %';