可以在http://www.aiice.com/314.html查看更好效果!!
- mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('God');
- +----------+
- | COUNT(*) |
- +----------+
- | 0 |
- +----------+
- mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('sin');
- +----------+
- | COUNT(*) |
- +----------+
- | 0 |
- +----------+
mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('God');
+----------+
| COUNT(*) |
+----------+
| 0 |
+----------+
mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('sin');
+----------+
| COUNT(*) |
+----------+
| 0 |
+----------+
搜索引擎会忽略那些太常见的 短语句如 the and 之类的单词都是索引不到的 不信邪 那验证下:
- mysql> SELECT COUNT(*) AS 'total verses',
- -> COUNT(IF(vtext LIKE '%God%',1,NULL)) AS 'verses containing "God"',
- -> COUNT(IF(vtext LIKE '%sin%',1,NULL)) AS 'verses containing "sin"'
- -> FROM kjv;
- +--------------+-------------------------+-------------------------+
- | total verses | verses containing "God" | verses containing "sin" |
- +--------------+-------------------------+-------------------------+
- | 31102 | 4118 | 1292 |
- +--------------+-------------------------+-------------------------+
mysql> SELECT COUNT(*) AS 'total verses',
-> COUNT(IF(vtext LIKE '%God%',1,NULL)) AS 'verses containing "God"',
-> COUNT(IF(vtext LIKE '%sin%',1,NULL)) AS 'verses containing "sin"'
-> FROM kjv;
+--------------+-------------------------+-------------------------+
| total verses | verses containing "God" | verses containing "sin" |
+--------------+-------------------------+-------------------------+
| 31102 | 4118 | 1292 |
+--------------+-------------------------+-------------------------+
看到了吧,其实正真的原因是因为:默认情况下 搜索引擎并不会把少于4个字母的单词包括在内。
you can change by setting the ft_min_word_len servervariable. For example, to tell the indexing engine to include words containing three or morecharacters, add a set-variable line to the [mysqld] group of the /etc/my.cnf file (or
whatever option file you put server settings in):
在Windows下就在C:\Program Files\MySQL\MySQL Server 5.0\my.ini里面添加就行
- [mysqld]
- set-variable = ft_min_word_len=3
- 或者
- ft_min_word_len=3
[mysqld]
set-variable = ft_min_word_len=3
或者
ft_min_word_len=3
然后 重启服务器 重建TEXTFULL 索引 否则无效
- mysql> ALTER TABLE kjv DROP INDEX vtext;
- mysql> ALTER TABLE kjv ADD FULLTEXT (vtext);
- //Then try out the new index to verify that it includes shorter words:
- mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('God');
- +----------+
- | COUNT(*) |
- +----------+
- | 3878 |
- +----------+
- mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('sin');
- +----------+
- | COUNT(*) |
- +----------+
- | 389 |
- +----------+
mysql> ALTER TABLE kjv DROP INDEX vtext;
mysql> ALTER TABLE kjv ADD FULLTEXT (vtext);
//Then try out the new index to verify that it includes shorter words:
mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('God');
+----------+
| COUNT(*) |
+----------+
| 3878 |
+----------+
mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('sin');
+----------+
| COUNT(*) |
+----------+
| 389 |
+----------+
至于结果比like要少是因为MATCH()语句进行的FULLTEXT搜索对整个单词匹配!
本文详细解析了MySQL全文搜索的工作原理,包括如何使用MATCH()函数进行全文匹配,以及如何通过调整配置参数来优化全文搜索性能,确保查询效率。通过实际案例展示调整全文搜索参数后查询结果的变化,并提供了在不同场景下的最佳实践建议。

395

被折叠的 条评论
为什么被折叠?



