我正在尝试了解 FULLTEXT 索引。
是否有一些 SQL 查询来测试“ft_min_word_len”变量?
我尝试仅在下面的示例中匹配四个字符,但它不起作用。如果“(数据库|数据)”不匹配,为什么返回第三行
mysql> SHOW VARIABLES LIKE 'ft_min_word_len';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| ft_min_word_len | 4 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE articles\G
*************************** 1. row ***************************
Table: articles
Create Table: CREATE TABLE `articles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`body` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`body`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' WITH QUERY EXPANSION);
+----+-------------------+------------------------------------------+
| id | title | body |
+----+-------------------+------------------------------------------+
| 1 | MySQL Tutorial | DBMS stands for DataBase ... |
| 5 | MySQL vs. YourSQL | In the following database comparison ... |
| 3 | Optimizing MySQL | In this tutorial we will show ... |
+----+-------------------+------------------------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('data' WITH QUERY EXPANSION);
Empty set (0.00 sec)
要
ft_min_word_len
作为查询检索,请运行以下命令:但是等等,你在问
您知道有 543 个单词被排除在 FULLTEXT 索引之外吗?
请注意您的查询和行数据中的以下内容...
will
和this
在停用词列表中。show
不在停用词列表中,因此搜索show
应该会产生切实的结果。data
不在正文列中作为其自己的词。尝试搜索data*
或+data*
我之前写过这个以及如何禁用默认的停用词列表:
Jan 26, 2012
:Mysql全文搜索my.cnf优化Dec 29, 2011
: MySQL全文索引问题更新 2013-04-25 12:26 EDT
@Michael-sqlbot在他对我的回答的评论中指出,
QUERY EXPANSION
由于相关性,他会进行双重查找以包括“near-misses”。如果@Michael-sqlbot 添加他的评论作为答案,我将收回我的答案,支持他的答案,并要求接受@Michael-sqlbot 的答案。由于
ft_min_word_len
设置为 4,MySQL 不会在 FULLTEXT 索引中索引短于 4 个字母的单词。此外,正如 Rolando 在单独的答案中提到的那样,MySQL 也不会索引停用词。如果需要,您可以覆盖默认的停用词列表,但默认情况下,许多四个字母的单词不会被索引,
为了证明这是正常工作,您只需从表中选择一个不是停用词的四个字母的单词,然后搜索它。查看您的简短示例,我看到 2 个不是默认停用词的四字母单词:
您可以使用以下查询测试这些:
为了说明不索引少于 4 个字符的单词这一点,请选择其中一个不是默认停用词的单词,查询它,您应该不会得到任何结果。我在您的数据中看到的唯一候选者是“vs”,所以使用它: