FULLTEXT搜索短的查询语句无效 解决方案

本文详细解析了MySQL全文搜索的工作原理,包括如何使用MATCH()函数进行全文匹配,以及如何通过调整配置参数来优化全文搜索性能,确保查询效率。通过实际案例展示调整全文搜索参数后查询结果的变化,并提供了在不同场景下的最佳实践建议。

可以在http://www.aiice.com/314.html查看更好效果!!

 

  1. mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('God');   
  2. +----------+   
  3. COUNT(*) |   
  4. +----------+   
  5. |        0 |   
  6. +----------+   
  7. mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('sin');   
  8. +----------+   
  9. COUNT(*) |   
  10. +----------+   
  11. |        0 |   
  12. +----------+  
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 之类的单词都是索引不到的 不信邪 那验证下:

  1. mysql> SELECT COUNT(*) AS 'total verses',   
  2.     -> COUNT(IF(vtext LIKE '%God%',1,NULL)) AS 'verses containing "God"',   
  3.     -> COUNT(IF(vtext LIKE '%sin%',1,NULL)) AS 'verses containing "sin"'  
  4.     -> FROM kjv;   
  5. +--------------+-------------------------+-------------------------+   
  6. | total verses | verses containing "God" | verses containing "sin" |   
  7. +--------------+-------------------------+-------------------------+   
  8. |        31102 |                    4118 |                    1292 |    
  9.   
  10. +--------------+-------------------------+-------------------------+  
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里面添加就行

  1. [mysqld]   
  2. set-variable = ft_min_word_len=3   
  3. 或者   
  4. ft_min_word_len=3  
[mysqld]
set-variable = ft_min_word_len=3
或者
ft_min_word_len=3

然后 重启服务器 重建TEXTFULL 索引 否则无效

  1. mysql> ALTER TABLE kjv DROP INDEX vtext;   
  2. mysql> ALTER TABLE kjv ADD FULLTEXT (vtext);   
  3. //Then try out the new index to verify that it includes shorter words:   
  4. mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('God');   
  5. +----------+   
  6. COUNT(*) |   
  7. +----------+   
  8. | 3878 |   
  9. +----------+   
  10. mysql> SELECT COUNT(*) FROM kjv WHERE MATCH(vtext) AGAINST('sin');   
  11. +----------+   
  12. COUNT(*) |   
  13. +----------+   
  14. | 389 |   
  15. +----------+  
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搜索对整个单词匹配!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值