我目前正在研究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”的查询,该怎么办?
答案 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”中查看更多信息
在FULLTEXT索引中,一个单词被认为足够普遍或琐碎,以至于它在搜索索引中被忽略而在搜索查询中被忽略。
不同的配置设置控制InnoDB和MyISAM表的停用词处理。
要强制全文索引包含三个字母词,您需要to change ft_min_word_len to 3(重新启动mysqld
并重建表)
答案 2 :(得分:-1)
也许您应该这样做:
SELECT author, title FROM classics WHERE title LIKE '% and %';