阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL中文全文搜索

132次阅读
没有评论

共计 2607 个字符,预计需要花费 7 分钟才能阅读完成。

我们在 MySQL 数据中可以使用 match against 语句解决中文全文搜索的问题

先看一个例句:

SELECT * FROM v9_search WHERE `siteid`= ‘1’ AND `typeid` = ‘3’ AND MATCH (`data`) AGAINST (‘ 基地 教育 韩天衡 ’ IN BOOLEAN MODE);

想要此语句生效需要满足以下几个条件:

1,表 ’v9_search’ 的类型必须是 MyISAM

2,字段 ’data’ 的类型必须是 char,varchar,text

3,字段 ’data’ 上建立全文检索(FULLTEXT)

4,字段 ’data’ 中的数据为空格分隔的中文分词,例如:韩天衡先生绘画 韩天衡 绘画 先生 先生 绘画

5,mysql 索引词的最小长度不大于 2

其中 1 - 4 条常用,第五条需要修改 mysql 配置,配置项为:ft_min_word_len

查看 Mysql 配置项的命令如下:

show VARIABLES like ‘ft_%’;

一般情况下,ft_min_word_len 为 4,修改此参数,需要在配置文件 [mysqld] 位置内加入如下配置:

ft_min_word_len = 2

不能使用:set GLOBAL ft_min_word_len = 2; 语句强制修改。

参数修改之后,重新启动 mysql 服务,并且重新建索引,重建索引命令如下:

REPAIR TABLE tbl_name QUICK;

如果数据表中记录较多,重建索引花费时间较长,需耐心等待几秒钟。

MySQL 全文搜索 match against 的用法

对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE  (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
1. 使用 Mysql 全文检索 fulltext 的先决条件
    表的类型必须是 MyISAM
建立全文检索的字段类型必须是 char,varchar,text

2. 建立全文检索先期配置
由于 Mysql 的默认配置是索引的词的长度是 4, 所以要支持中文单字的话, 首先更改这个.
*Unix 用户要修改 my.cnf, 一般此文件在 /etc/my.cnf, 如果没有找到, 先查找一下 find / -name ‘my.cnf’
在 [mysqld] 位置内加入: 
      ft_min_word_len    = 2
其它属性还有
      ft_wordlist_charset = gbk
      ft_wordlist_file = /home/soft/mysql/share/mysql/wordlist-gbk.txt
      ft_stopword_file = /home/soft/mysql/share/mysql/stopwords-gbk.txt
稍微解释一下:
      ft_wordlist_charset 表示词典的字符集, 目前支持良好的有(UTF-8, gbk, gb2312, big5)
      ft_wordlist_file 是词表文件, 每行包括一个词及其词频(用若干制表符或空格分开, 消岐专用)
      ft_stopword_file 表示过滤掉不索引的词表, 一行一个.
      ft_min_word_len    加入索引的词的最小长度, 缺省是 4, 为了支持中文单字故改为 2

3. 建立全文检索
在建表中用 FullText 关键字标识字段, 已存在的表用 ALTER TABLE (或 CREATE INDEX) 创建索引
CREATE fulltext INDEX index_name ON table_name(colum_name);

4. 使用全文检索
    在 SELECT 的 WHERE 字句中用 MATCH 函数, 索引的关键词用 AGAINST 标识,IN BOOLEAN MODE 是只有含有关键字就行, 不用在乎位置, 是不是起启位置.
SELECT * FROM articles WHERE MATCH (tags) AGAINST (‘ 旅游 ’ IN BOOLEAN MODE);

5. 详细的说明请参数 Mysql 官方网站
http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-search
这是 Mysql 5.1 的, 不过 4.X 也可以做为参考, 基本一置. 我用的就是 Mysql 4.1.

MySQL 支持全文索引 (Full-Text) 已经很久了,目前,fulltext 是一种只适用于 MyISAM 表的一个索引类型,而且对定义索引列的数据类型也有限制,只能是以下三种的组合 char、varchar、text。fulltext 可以在创建表的同时就一起定义好,或者在表创建完成之后,通过语句 alter table 或 create index 来追加索引,总之先后的效果是一样的,但是两者的效率却是存在很大差异的,大量的实验证明,对于大数量的表来说,先加载数据再来定义全文索引的 速度要远远优于在一个已经定义好全文索引的表里面插入大量数据的速度。一定会问:这是问什么呢?其实,道理很简单,前者只需要一次性对你的索引列表进行操 作,排序比较都是在内存中完成,然后写入硬盘;后者则要一条一条去硬盘中读取索引表然后再进行比较最后写入,自然这样速度就会很慢。MySQL 是 通过 match() 和 against()这两个函数来实现它的全文索引查询的功能。match()中的字段名称要和 fulltext 中定义的字段一致,如 果采用 boolean 模式搜索,也允许只包括 fulltext 中的某个字段,不需要全部列出。against()中定义的是所要搜索的字符串以及要求数据 库通过哪种模式去执行全文索引的搜索查询。

家用一下搜索引擎就会发现,分词的情况只是出现在当整词命中为 0 的情况下。
而具体怎样分词,大家可以参考一下 baidu 搜索试验结果:

·如果搜“徐祖宁宁”,结果为“徐祖”+“宁宁”。(搜人名的情况下,它可能有一个百家姓词典,自动将姓后第一个字归前)
·搜“徐宁愿”,结果为“徐宁愿”。(说明“宁愿”归“徐”所有。同上。因为徐是姓。)
·搜“徐祖宁愿”,结果为“徐祖”+“宁愿”。(因为“宁愿”是词,故“徐”只带“祖”。)
·搜“徐祖宁高”,结果为“徐祖宁”。(因为“宁高”不是关键字,所以“宁”归前词所有。而“高”可能因为是单字,为提高前词搜索效率故被省略。)

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-03/141537.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2607字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中