mysql全文索引的坑,mysql数据库中文全文检索中的坑

在MySQL 5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。

从MySQL 5.7.6开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。

本文使用的是MySQL 5.7.25

MyISAM数据引擎 innodb支持事务,myisam不支持

本人因其他条件原因,无法改为innodb数据引擎,建议用innodb

本文使用的Navicat Preminum 可视化数据库操作软件

32c7db44b2027a5c3df1b6d6ac9386df.png

ff43fccb1c8e0570f8dda8610761539f.png

ngram全文解析器

ngram就是一段文字里面连续的n个字的序列。ngram全文解析器能够对文本进行分词,每个单词是连续的n个字的序列。例如,用ngram全文解析器对“我爱我的祖国”进行分词:n=1: '我', '爱', '我', '的' ,'祖', '国'

n=2: '我爱', '我的', '祖国'

n=3: '我爱我', '的祖国'

n=4: 。。。

MySQL 中使用全局变量ngram_token_size来配置ngram中n的大小,它的取值范围是1到10,默认值是2。通常ngram_token_size设置为要查询的单词的最小字数。如果需要搜索单字,就要把ngram_token_size设置为1。在默认值是2的情况下,搜索单字是得不到任何结果的。因为中文单词最少是两个汉字,推荐使用默认值2。

查看命令:SHOW VARIABLES LIKE 'ngram%';

f1a1fc29e4d1fef1412e17db7c197771.png

下面我们开始主题;CREATE TABLE fb_document (

id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,

title VARCHAR (200),

keyword TEXT,

FULLTEXT (title, keyword) WITH PARSER ngram

) ENGINE = MYISAM;

如果你的数据表已经创建;ALTER TABLE fb_document ADD FULLTEXT INDEX fb_index (title,keyword) WITH PARSER ngram;

居然报错:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause

show variables like "sql_mode";

set sql_mode='';

set sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';

终于可以了,然后在程序中;$title='我爱我的祖国';

select id from fb_document where MATCH(title,keyword) AGAINST('".$title."' IN BOOLEAN MODE);

常用的全文检索模式有两种:

1、自然语言模式(NATURAL LANGUAGE MODE) ,

自然语言模式是MySQL 默认的全文检索模式。自然语言模式不能使用操作符,不能指定关键词必须出现或者必须不能出现等复杂查询。

2、BOOLEAN模式(BOOLEAN MODE)

BOOLEAN模式可以使用操作符,可以支持指定关键词必须出现或者必须不能出现或者关键词的权重高还是低等复杂查询。

本人实测,经验有限,虽然可以成功的搜索到内容,但是效果不太理想

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值