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

时间:2016.04.19 发布人:ElalfChofsNaf

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

已解决问题

谷歌ElalfChofsNaf用户在2016.04.19提交了关于“起亚k3基于mysql全文索引的深入理解”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-02-23T06:45:37。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,你是我的宝贝,你是我的花,谢谢你对我的帮助!

希望以下的回答,能够帮助你。

第1个回答

用户名:拍拍熊Roshan  

前言:本文简来自单讲述全文索引的应用实例,MYSQL演示版本5.5.24。
Q:全文索引适用于什么场合
A:全文索引是目前实现大**搜索的关键技术。
至于更详细的介绍请自液令果他千入权据行百度,本文不再阐述。
--------------------------------------------------------------------------------
一、如何设置?



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

二、设置条件
1洲述犯操划太给庆控虽重.表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.距齐6的InnoDB支持全文索引)
2.字段类型:char、varchar和text

三、配置
my.ini配置文件中添加
问答#MySQL全文索血较鸡边张同故均欢必致引查询关键词最小长度限制
[mysqld]
ft_min_word_len=1
保存后重启MYSQL,执行SQL语句
复制代码代码如下:
Sh**OWVARIABLES

查看ft_min_word_len是否设置成功,如果坏没设置成功请确保
1.确认my.ini正确配置,注意不要搞错my.in着又绿i的位置
2.确认mysql已经重启,实在不行重启电脑
其他相关配置请自行百度。
注:重新设置配置后,已经设置的索引需要开径司城排晚职包必重新设置生成索引

四、SQL语法
首先液生成temp表
复制代码代码如下:
CREATETAB政旧见告LEIFNOTEXISTS`temp`(
`id`int(11)NOT**LLAUTO_INCREMENT,
`char`char(50)NOT**LL,
`varchar`varchar(50)NO机争宪古践主笔宪执T**LL,
`text频讲把轴风茶传`textNOTNULL,
PRIMARYKEY(`id`),
FULLTEXTKEY`char`(`char及责井就罗刚笔临胜`),
FULLTEXTKEY`varchar`(`varchar`),
F现美升ULLTEXTKEY`text`(`text`)
)ENGINE=MyISAMDEFAULTCh**AR**T=utf8AUTO_INCREMENT=2;
IN**RTINTO`temp`(`id`,`char`,`varchar`,`text`)VALUES
(1,'abc我知混况静冲并斯蛋道123','abc我知道123','abc我知道123');

搜索`char`字段按外连须李应露'a'值
复制代码代码如下:
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('a')

但是你会发现查询无结果?!
这时你也许会想:哎呀怎么回事,我明明按照步骤来做的啊,是不是那里漏了或者错了?
你不要着急,做程序是这样的,出错总是有的,静下心来,着急是妈界课己印不能解决问题的。

如果一个关键词在50%的**出现,那么这个词会被当做无效词。
如果你想去除50%的现准色由势米课送质在请使用INBOOLEANMODE搜索
复制代码代码如下:
**LE件站渐程念只CT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('a'INBOOLEANMODE)

这样就可以查询出结果了,但是我们不推荐使用。
全文索引的搜索模式的介绍自行百度。

我们先加入几条无用**已解除50%限制
复制代码代码如下:
IN**RTINTO`temp`(
`id`,
`char`,
`varchar`,
`text`
)
VALUES(
**LL,'7','7','7'
),(
**LL,'7','7','7'
),(
**LL,'a,bc,我,知道,1,23','a,bc,我,知道,1,23','a,bc,我,知道,1,23'
),(
**LL,'x','x','x'
);

这时你执行以下SQL语句都可以查询到**
复制代码代码如下:
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('a');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('bc');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('我');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('知道');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('1');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('23');

以下SQL搜索不到**
复制代码代码如下:
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('b');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('c');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('知');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('道');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('2');
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('3');

如果搜索多个词,请用空格或者逗号隔开
复制代码代码如下:
**LECT*FROM`temp`Wh**EREMATCh**(`char`)AGAINST('ax');
**LECT*FROM`temp`Wh**EREMATCh**(`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复制到你的Ph**P目录下的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_**mp($temp);

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