在MySQL中,“ Stopword”一词是什么意思?

时间:2019-06-02 06:47:38

标签: mysql full-text-indexing

我目前正在研究MySQL命令,并被困在FULLTEXT索引上使用“ MATCH ... AGAINST”命令。遇到“停用词”(在我的情况下为“ and”)时,它将返回“空集”。

这就是我所做的。我正在使用的数据库包含书籍及其作者的列表。我正在尝试选择标题中包含“ and”的条目。这是我的“经典”表中的列表。

+--------------------+------------------------------+
| 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)

我期望的结果是“傲慢与偏见”和“罗密欧与朱丽叶”,而不是“空置(0.00秒)”。我现在意识到“和”是一个停用词。

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

3 个答案:

答案 0 :(得分:3)

  

我的问题是“停用词”是什么意思...

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

有关更多信息,请阅读stopwords上的Wikipedia页面。

MySQL使用的术语与正常定义一致。

  

...,我怎么知道哪个词是停用词?

对于InnoDB表,您可以查询INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD表。

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

  

如果我真的想选择标题中包含“ and”的查询,该怎么办?

MySQL文档解释了如何做到这一点;参见Section 12.9.4 Full-Text Stopwords。 (有太多细节无法在此处复制。)

我的阅读是,您需要进行配置更改并重新启动数据库服务器以更改停用词。对于InnoDB表,您还需要重新生成表的全文本索引。

不幸的是,您不能(有效地)更改每个查询的停用词...如果您要这样做。

答案 1 :(得分:0)

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

  

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

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

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

glossary defines stopword为:

  

在FULLTEXT索引中,一个单词被认为足够普遍或琐碎,以至于它在搜索索引中被忽略而在搜索查询中被忽略。
  不同的配置设置控制InnoDB和MyISAM表的停用词处理。


要强制全文索引包含三个字母词,您需要to change ft_min_word_len to 3(重新启动mysqld并重建表)

答案 2 :(得分:-1)

也许您应该这样做:

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