加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2020-12-12 03:01:11 所属栏目:MySql教程 来源:网络整理
导读:《Mysql应用基于mysql全文索引的深入理解》要点: 本文介绍了Mysql应用基于mysql全文索引的深入理解,希望对您有用。如果有疑问,可以联系我们。 MYSQL入门 前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24. Q:全文索引适用于什么场合? A:全文索

《Mysql应用基于mysql全文索引的深入理解》要点:
本文介绍了Mysql应用基于mysql全文索引的深入理解,希望对您有用。如果有疑问,可以联系我们。

MYSQL入门前言:本文简单讲述全文索引的应用实例,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表
MYSQL入门
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');

MYSQL入门搜索`char`字段 'a' 值

MYSQL入门
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a')

MYSQL入门但是你会发现查询无结果?!
这时你也许会想:哎呀怎么回事,我明明依照步骤来做的啊,是不是那里漏了或者错了?
你不要着急,做程序是这样的,出错总是有的,静下心来,着急是不能解决问题的.
?
如果一个关键词在50%的数据出现,那么这个词会被当做无效词.
如果你想去除50%的现在请使用IN BOOLEAN MODE搜索

MYSQL入门
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a' IN BOOLEAN MODE)

MYSQL入门这样就可以查询出结果了,但是我们不保举使用.
全文索引的搜索模式的介绍自行百度.
?
我们先加入几条无用数据已解除50%限制

MYSQL入门
INSERT INTO `temp` (
`id`,`text`
)
VALUES (
NULL,'7','7'
),(
NULL,'a,bc,我,知道,1,23',23'
),'x','x'
);

MYSQL入门这时你执行以下SQL语句都可以查询到数据

MYSQL入门
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');

MYSQL入门以下SQL搜索不到数据

MYSQL入门
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');

MYSQL入门如果搜索多个词,请用空格或者逗号隔开

MYSQL入门
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a x');
SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a,x');

MYSQL入门上面的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.重启你的服务器
测试

MYSQL入门
$str="测试中文分词";
$so = scws_new();
$so->send_text($str);
$temp=$so->get_result();
$so->close();
var_dump($temp);

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

欢迎参与《Mysql应用基于mysql全文索引的深入理解》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读