基于mysql全文索引的深入理解 |
本文标签:mysql,索引 前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24 。 Q:全文索引适用于什么场合? A:全文索引是目前实现大数据搜索的关键技术 。 至于更详细的介绍请自行百度,本文不再阐述 。 -------------------------------------------------------------------------------- 一、如何设置?
复制代码 代码如下: SHOW VARIABLES 查看ft_min_word_len是否设置成功,如果没设置成功请确保 1.确认my.ini正确配置,注意不要搞错my.ini的位置 2.确认mysql已经重启,实在不行重启电脑 其他相关配置请自行百度 。 注:重新设置配置后,已经设置的索引需要重新设置生成索引 四、SQL语法 首先生成temp表 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `temp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `char` char(50) NOT NULL, `varchar` varchar(50) NOT NULL, `text` text NOT NULL, PRIMARY KEY (`id`), FULLTEXT KEY `char` (`char`), FULLTEXT KEY `varchar` (`varchar`), FULLTEXT KEY `text` (`text`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `temp` (`id`, `char`, `varchar`, `text`) VALUES (1, a bc 我 知道 1 23, a bc 我 知道 1 23, a bc 我 知道 1 23); 搜索`char`字段 a 值 复制代码 代码如下: SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (a) 但是你会发现查询无结果?! 这时你也许会想:哎呀怎么回事,我明明按照步骤来做的啊,是不是那里漏了或者错了? 你不要着急,做程序是这样的,出错总是有的,静下心来,着急是不能解决问题的 。 如果一个关键词在50%的数据出现,那么这个词会被当做无效词 。 如果你想去除50%的现在请使用IN BOOLEAN MODE搜索 复制代码 代码如下: SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (a IN BOOLEAN MODE) 这样就可以查询出结果了,但是我们不推荐使用 。 全文索引的搜索模式的介绍自行百度 。 我们先加入几条无用数据已解除50%限制 复制代码 代码如下: INSERT INTO `temp` ( `id` , `char` , `varchar` , `text` ) VALUES ( NULL , 7, 7, 7 ), ( NULL , 7, 7, 7 ), ( NULL , a,bc,我,知道,1,23, a,bc,我,知道,1,23, a,bc,我,知道,1,23 ), ( NULL , x, x, x ); 这时你执行以下SQL语句都可以查询到数据 复制代码 代码如下: SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (a); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (bc); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (我); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (知道); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (1); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (23); 以下SQL搜索不到数据 复制代码 代码如下: SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (b); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (c); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (知); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (道); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (2); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (3); 如果搜索多个词,请用空格或者逗号隔开 复制代码 代码如下: SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (a x); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST (a,x); 上面的SQL都可以查询到三条数据 五、分词 看到这里你应该发现我们字段里的值也是分词,不能直接插入原始数据 。 全文索引应用流程: 1.接收数据-数据分词-入库 2.接收数据-数据分词-查询 现在有个重要的问题:怎么对数据分词? 数据分词一般我们会使用一些成熟免费的分词系统,当然如果你有能力也可以自己做分词系统,这里我们推荐使用SCWS分词插件 。 首先下载 1.php_scws.dll 注意对应版本 2.XDB词典文件 3.规则集文件 下载地址 安装scws 1.先建一个文件夹,位置不限,但是最好不要中文路径 。 2.解压{规则集文件},把xdb、三个INI文件全部扔到 D:\scws 3.把php_scws.dll复制到你的PHP目录下的EXT文件夹里面 4.在 php.ini 的末尾加入以下几行: [scws] ; 注意请检查 php.ini 中的 extension_dir 的设定值是否正确, 否则请将 extension_dir 设为空, ; 再把 php_scws.dll 指定为绝对路径 。 extension = php_scws.dll scws.default.charset = utf8 scws.default.fpath = "D:\scws" 5.重启你的服务器 测试 复制代码 代码如下: $str="测试中文分词"; $so = scws_new(); $so->send_text($str); $temp=$so->get_result(); $so->close(); var_dump($temp); 如果安装未成功,请参照官方说明文档 -------------------------------------------------------------------------------- 这样我们就可以使用全文索引技术了 。 |