欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于mysql全文索引的深入理解

程序员文章站 2024-02-20 09:13:52
前言:本文简单讲述全文索引的应用实例,mysql演示版本5.5.24。 q:全文索引适用于什么场合? a:全文索引是目前实现大数据搜索的关键技术。 至于更详细的介绍请...

前言:本文简单讲述全文索引的应用实例,mysql演示版本5.5.24。
q:全文索引适用于什么场合?
a:全文索引是目前实现大数据搜索的关键技术。
至于更详细的介绍请自行百度,本文不再阐述。
--------------------------------------------------------------------------------
一、如何设置?

基于mysql全文索引的深入理解

如图点击结尾处的{全文搜索}即可设置全文索引,不同mysql版本名字可能不同。

二、设置条件
1.表的存储引擎是myisam,默认存储引擎innodb不支持全文索引(新版本mysql5.6的innodb支持全文索引)
2.字段类型:char、varchar和text
 
三、配置
my.ini配置文件中添加
# mysql全文索引查询关键词最小长度限制
[mysqld]
ft_min_word_len = 1
保存后重启mysql,执行sql语句

复制代码 代码如下:

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);

如果安装未成功,请参照官方说明文档
--------------------------------------------------------------------------------
这样我们就可以使用全文索引技术了。